在函数中使用全局变量

新手上路,请多包涵

如何在函数中创建或使用全局变量?

如何使用在其他函数中的一个函数中定义的全局变量?


未能在适当的地方使用 global 关键字通常会导致 UnboundLocalError 。具体规则在 UnboundLocalError on local variable when reassigned after first use 中进行了解释。通常,在寻求解释时,请关闭其他问题作为 问题的副本,当有人只需要知道 global 关键字时,请关闭 问题。

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

阅读 588
2 个回答

您可以在其他函数中使用全局变量,方法是将其声明为 global 在为其分配值的每个函数中:

 globvar = 0

def set_globvar_to_one():
    global globvar    # Needed to modify global copy of globvar
    globvar = 1

def print_globvar():
    print(globvar)     # No need for global declaration to read value of globvar

set_globvar_to_one()
print_globvar()       # Prints 1

由于不清楚 globvar = 1 是创建局部变量还是更改全局变量,Python 默认创建局部变量,并让您使用 global 关键字显式选择其他行为。

如果您想跨模块共享全局变量,请参阅其他答案。

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

如果我正确理解您的情况,您看到的是 Python 如何处理本地(函数)和全局(模块)名称空间的结果。

假设你有这样一个模块:

 # sample.py
_my_global = 5

def func1():
    _my_global = 42

def func2():
    print _my_global

func1()
func2()

您可能希望它打印 42,但它却打印 5。如前所述,如果您将“ global ”声明添加到 func1() ,则 func2() 将打印 42。

 def func1():
    global _my_global
    _my_global = 42

这里发生的事情是 Python 假定 分配给 函数内任何位置的任何名称都是该函数的本地名称,除非另有明确说明。如果它只是从一个名称中 _读取_,并且该名称在本地不存在,它将尝试在任何包含范围(例如模块的全局范围)中查找该名称。

因此,当您将 42 分配给名称 _my_global 时,Python 会创建一个局部变量来隐藏同名的全局变量。当 func1() 返回时,该本地超出范围并被 垃圾收集;同时, func2() 除了(未修改的)全局名称之外,再也看不到任何东西。请注意,此命名空间决定发生在编译时,而不是运行时——如果您要读取 _my_global func1() 在分配给它之前,您会得到一个 UnboundLocalError ,因为 Python 已经决定它必须是一个局部变量,但它还没有任何关联的值。但是通过使用“ global ”语句,您告诉 Python 它应该在别处寻找名称而不是在本地分配给它。

(我相信这种行为主要源于对本地命名空间的优化——如果没有这种行为,Python 的 VM 每次在函数内部分配一个新名称时都需要执行至少三个名称查找(以确保该名称没有’ t 已经存在于模块/内置级别),这将大大减慢非常常见的操作。)

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

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