在Python中使用“全局”关键字
我从阅读文档不解的是,Python有功能的单独的命名空间,如果我想在函数中使用全局变量,我需要使用global
。
我正在使用Python 2.7,并且我尝试了这个小测试
>>> sub = ['0', '0', '0', '0']
>>> def getJoin():
... return '.'.join(sub)
...
>>> getJoin()
'0.0.0.0'
即使没有global
,看起来事情仍然正常。 我能够访问全局变量没有任何问题。
我错过了什么? 另外,以下是Python文档:
不能将全局语句中列出的名称定义为形式参数,也不能将其定义为for循环控制目标,类定义,函数定义或导入语句。
尽管形式参数和类定义对我来说很有意义,但我无法理解对循环控制目标和函数定义的限制。
关键字global
仅用于在本地环境中更改或创建全局变量,尽管创建全局变量很少被认为是一个好的解决方案。
def bob():
me = "locally defined" # Defined only in local context
print me
bob()
print me # Asking for a global variable
以上将给你:
locally defined
Traceback (most recent call last):
File "file.py", line 9, in <module>
print me
NameError: name 'me' is not defined
而如果使用global
语句,变量将在函数的“范围之外”变得可用,从而有效地成为全局变量。
def bob():
global me
me = "locally defined" # Defined locally but declared as global
print me
bob()
print me # Asking for a global variable
所以上面的代码会给你:
locally defined
locally defined
另外,由于python的本质,你也可以使用global
来声明本地上下文中的函数,类或其他对象。 虽然我会建议不要这样做,因为如果出现问题或需要调试,它会导致恶梦。
虽然您可以在不使用global
关键字的情况下访问全局变量,但如果要修改它们,则必须使用global
关键字。 例如:
foo = 1
def test():
foo = 2 # new local foo
def blub():
global foo
foo = 3 # changes the value of the global foo
在你的情况下,你只是访问列表sub
。
这是访问名称并在范围内绑定它的区别。
如果您只是查找变量来读取它的值,那么您可以访问全局和本地范围。
但是,如果您将名称分配给名称不在本地范围内的变量,则您将该名称绑定到该范围(如果该名称也以全局方式存在,您将隐藏该名称)。
如果您希望能够分配全局名称,则需要告诉解析器使用全局名称,而不是绑定新的本地名称 - 这就是'全局'关键字的作用。
绑定块中的任何位置会导致该块中的任何位置的名称都被绑定,这可能会导致一些相当奇怪的后果(例如,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
>>>
链接地址: http://www.djcxy.com/p/51663.html