[python]局部變量和全局變量某注意點(diǎn)

本筆記開始于一個(gè)錯(cuò)誤
UnboundLocalError: local variable ‘a(chǎn)' referenced before assignment
a局部變量在賦值之前就被調(diào)用是不可以的。

首先我們來(lái)通過(guò)下面的代碼看全局變量和局部變量

>>> someVar = 42 
>>> def myFunction(): 
...     someVar = 100
...     print(someVar)
... 
>>> myFunction()
100
>>> someVar
42
>>> someVar = 1000
>>> myFunction()
100
>>> 

這就是說(shuō),定義函數(shù)的時(shí)候,全局變量和局部變量其實(shí)是不一樣的,只是相同的名字但是其實(shí)指向的位置不同。這與類的方法中不同,類的方法還需要訪問限制才可以做到隔絕。

然后就發(fā)現(xiàn),在定義局部變量前在函數(shù)中使用局部變量(不一定有與局部變量同名的全局變量存在)就會(huì)導(dǎo)致“UnboundLocalError: local variable ‘a(chǎn)' referenced before assignment”)

>>> def a():
...     print(newvar)
...     newvar = 100
... 
>>> a()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in a
UnboundLocalError: local variable 'newvar' referenced before assignment
>>> 

解釋:因?yàn)槟愕膎ewvar還未在函數(shù)內(nèi)部定義的時(shí)候, newvar還是一個(gè)全局變量。
必須是在函數(shù)內(nèi)部賦值過(guò)了才成為局部變量
你的print(newvar)就會(huì)認(rèn)為是引用一個(gè)全局變量,而之后你又定義了一個(gè)同名的局部變量,那么電腦就凌亂了,就出錯(cuò)啦!

>>> def myFunction():
...     some = 100
...     print(some)
... 
>>> myFunction()
100

這樣寫就可以。因?yàn)橐呀?jīng)在內(nèi)部定義了some,some在函數(shù)內(nèi)已經(jīng)是局部變量了,那么這時(shí)候在函數(shù)內(nèi)部用some就都認(rèn)為是局部變量。

>>> def myFunction():
...     print(some)
... 
>>> myFunction()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in myFunction
NameError: name 'some' is not defined
>>> some = 42
>>> myFunction()
42
>>> 

這樣也是可以的,因?yàn)閟ome認(rèn)為是全局變量,只是沒有指向,所以剛開始會(huì)顯示not defined,但是賦值之后就ok拉!

就算是函數(shù)調(diào)用,其中間局部變量也不會(huì)讓全局變量的指向改變。

最后編輯于
?著作權(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)容