为什么访问全局变量不需要“全局”关键字?

新手上路,请多包涵

据我了解,Python 有一个单独的函数命名空间,所以如果我想在函数中使用全局变量,我可能应该使用 global

但是,即使没有 global ,我也能够访问全局变量:

 >>> sub = ['0', '0', '0', '0']
>>> def getJoin():
...     return '.'.join(sub)
...
>>> getJoin()
'0.0.0.0'

为什么这行得通?


另请参阅 UnboundLocalError on local variable when reassigned after first use 尝试在没有 global 的情况下 分配给 全局变量时发生的错误。有关如何 使用全局变量的一般问题,请参阅在函数 中使用全局变量。

原文由 nik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 344
2 个回答

关键字 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 在本地上下文中声明函数、类或其他对象。尽管我建议不要这样做,因为如果出现问题或需要调试,它会导致噩梦。

原文由 unode 发布,翻译遵循 CC BY-SA 4.0 许可协议

虽然您可以在不使用 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

原文由 Ivo Wetzel 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题