python中變量作用于并不陌生凛澎,函數(shù)中的是局部變量,先看一個小例子:
In [1]: def f1(a):
...: print(a)
...: print(b)
調(diào)用
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
在執(zhí)行一下
In [5]: f1(3)
3
5
說明在執(zhí)行函數(shù)時函數(shù)會去全局變量中找b的值
這點明白之后我們再來看一個讓人有點吃驚的例子:
In [6]: b = 6
In [7]: def f1(a):
...: print(a)
...: print(b)
...: b = 9
看完函數(shù)你一定會覺得打印時候b應(yīng)該顯示6吧乳愉,我們看看結(jié)果
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編譯函數(shù)的定義體時逃延,判斷b是局部變量览妖,所以在執(zhí)行時會獲取b之前沒有定義,所以報錯揽祥,我們將b的定義放到打印之前就好了讽膏,這恰恰說明了python調(diào)用的過程順序,先局部拄丰,后全局府树。
還有一種解決辦法就是在使用b之前使用global聲明b要用全局變量里面的
如果還想進(jìn)一步看看解釋器的加載內(nèi)容,可以使用python的dis模塊來查看料按,過程更加清晰奄侠。