本笔记开始于一个错误
UnboundLocalError: local variable ‘a' referenced before assignment
a局部变量在赋值之前就被调用是不可以的。
首先我们来通过下面的代码看全局变量和局部变量
>>> someVar = 42
>>> def myFunction():
... someVar = 100
... print(someVar)
...
>>> myFunction()
100
>>> someVar
42
>>> someVar = 1000
>>> myFunction()
100
>>>
这就是说,定义函数的时候,全局变量和局部变量其实是不一样的,只是相同的名字但是其实指向的位置不同。这与类的方法中不同,类的方法还需要访问限制才可以做到隔绝。
然后就发现,在定义局部变量前在函数中使用局部变量(不一定有与局部变量同名的全局变量存在)就会导致“UnboundLocalError: local variable ‘a' 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
>>>
解释:因为你的newvar还未在函数内部定义的时候, newvar还是一个全局变量。
必须是在函数内部赋值过了才成为局部变量
你的print(newvar)就会认为是引用一个全局变量,而之后你又定义了一个同名的局部变量,那么电脑就凌乱了,就出错啦!
>>> def myFunction():
... some = 100
... print(some)
...
>>> myFunction()
100
这样写就可以。因为已经在内部定义了some,some在函数内已经是局部变量了,那么这时候在函数内部用some就都认为是局部变量。
>>> 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
>>>
这样也是可以的,因为some认为是全局变量,只是没有指向,所以刚开始会显示not defined,但是赋值之后就ok拉!
就算是函数调用,其中间局部变量也不会让全局变量的指向改变。