根据我的理解,Python有一个单独的函数名称空间,所以如果我想在函数中使用全局变量,我可能应该使用global。
然而,我能够访问一个全局变量,即使没有全局:
>>> sub = ['0', '0', '0', '0']
>>> def getJoin():
... return '.'.join(sub)
...
>>> getJoin()
'0.0.0.0'
为什么会这样?
另请参阅第一次使用后重新分配局部变量时发生的UnboundLocalError,以了解试图分配给全局变量而不使用全局变量时发生的错误。有关如何使用全局变量的一般问题,请参阅在函数中使用全局变量。
这就是访问名称和在作用域中绑定名称之间的区别。
如果你只是查找一个变量来读取它的值,你可以访问全局作用域和局部作用域。
但是,如果赋值给的变量的名称不在局部作用域中,则将该名称绑定到此作用域中(如果该名称也作为全局变量存在,则将隐藏它)。
如果您希望能够分配全局名称,则需要告诉解析器使用全局名称,而不是绑定新的本地名称——这就是'global'关键字所做的。
绑定块中的任何位置都会导致该块中的任何位置的名称都被绑定,这可能会导致一些看起来相当奇怪的结果(例如,UnboundLocalError突然出现在之前的工作代码中)。
>>> a = 1
>>> def p():
print(a) # accessing global scope, no binding going on
>>> def q():
a = 3 # binding a name in local scope - hiding global
print(a)
>>> def r():
print(a) # fail - a is bound to local scope, but not assigned yet
a = 4
>>> p()
1
>>> q()
3
>>> r()
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
r()
File "<pyshell#32>", line 2, in r
print(a) # fail - a is bound to local scope, but not assigned yet
UnboundLocalError: local variable 'a' referenced before assignment
>>>