python變量作用域中容易忽略的點(diǎn)

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模塊來查看,過程更加清晰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容