在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

上一篇: Use of "global" keyword in Python

下一篇: Understanding Global & Local Scope in Javascript