python中變量作用于并不陌生,函數(shù)中的是局部變量,先看一個(gè)小例子:
In [1]: def f1(a):
...: print(a)
...: print(b)
調(diào)用
f1(3)
很明顯這個(gè)會(huì)報(bào)錯(cuò)
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
這時(shí)我們需要添加對(duì)b的賦值操作
b = 5
在執(zhí)行一下
In [5]: f1(3)
3
5
說明在執(zhí)行函數(shù)時(shí)函數(shù)會(huì)去全局變量中找b的值
這點(diǎn)明白之后我們?cè)賮砜匆粋€(gè)讓人有點(diǎn)吃驚的例子:
In [6]: b = 6
In [7]: def f1(a):
...: print(a)
...: print(b)
...: b = 9
看完函數(shù)你一定會(huì)覺得打印時(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
什么?報(bào)錯(cuò)了,顯示本地變量在賦值前使用!
事實(shí)是:python編譯函數(shù)的定義體時(shí),判斷b是局部變量,所以在執(zhí)行時(shí)會(huì)獲取b之前沒有定義,所以報(bào)錯(cuò),我們將b的定義放到打印之前就好了,這恰恰說明了python調(diào)用的過程順序,先局部,后全局。
還有一種解決辦法就是在使用b之前使用global聲明b要用全局變量里面的
如果還想進(jìn)一步看看解釋器的加載內(nèi)容,可以使用python的dis模塊來查看,過程更加清晰。