python中變量作用于并不陌生,函數中的是局部變量,先看一個小例子:
In [1]: def f1(a):
...: print(a)
...: print(b)
調用
f1(3)
很明顯這個會報錯
NameError Traceback (most recent call last)
<ipython-input-3-a636accabfae> in <module>()
----> 1 f1(3)
<ipython-input-1-8c139ea215ce> in f1(a)
1 def f1(a):
2 print(a)
----> 3 print(b)
4
NameError: name 'b' is not defined
這時我們需要添加對b的賦值操作
b = 5
在執行一下
In [5]: f1(3)
3
5
說明在執行函數時函數會去全局變量中找b的值
這點明白之后我們再來看一個讓人有點吃驚的例子:
In [6]: b = 6
In [7]: def f1(a):
...: print(a)
...: print(b)
...: b = 9
看完函數你一定會覺得打印時候b應該顯示6吧,我們看看結果
UnboundLocalError Traceback (most recent call last)
<ipython-input-8-a636accabfae> in <module>()
----> 1 f1(3)
<ipython-input-7-b4880e75da42> in f1(a)
1 def f1(a):
2 print(a)
----> 3 print(b)
4 b = 9
5
UnboundLocalError: local variable 'b' referenced before assignment
什么?報錯了,顯示本地變量在賦值前使用!
事實是:python編譯函數的定義體時,判斷b是局部變量,所以在執行時會獲取b之前沒有定義,所以報錯,我們將b的定義放到打印之前就好了,這恰恰說明了python調用的過程順序,先局部,后全局。
還有一種解決辦法就是在使用b之前使用global聲明b要用全局變量里面的
如果還想進一步看看解釋器的加載內容,可以使用python的dis模塊來查看,過程更加清晰。