本筆記開始于一個(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ì)讓全局變量的指向改變。