在函数中使用全局变量
在函数中使用全局变量
如何在函数内创建或使用全局变量?
如何在其他函数中使用在一个函数中定义的全局变量?
在适当的地方未使用global
关键字通常会导致UnboundLocalError
。关于此的详细规则请参见UnboundLocalError on local variable when reassigned after first use。通常,在寻求解释时,请将其他问题视为该问题的重复,将该问题视为仅需了解global
关键字的问题。
如果我正确理解了您的情况,您看到的结果是Python处理本地(函数)和全局(模块)命名空间的结果。
假设您有一个像这样的模块:
# sample.py _my_global = 5 def func1(): _my_global = 42 def func2(): print _my_global func1() func2()
您可能希望这会打印出42,但实际上它会打印5。正如先前提到的那样,如果您在func1()
中添加一个“global
”声明,则func2()
将打印42。
def func1(): global _my_global _my_global = 42
这里发生的情况是,Python假设在函数内的任何地方分配的任何名称都是该函数本地的,除非显式告知其他情况。如果它只是从一个名称中读取,并且该名称在本地不存在,则它将尝试在任何包含作用域中查找该名称(例如模块的全局作用域)。
因此,当您将42分配给名称_my_global
时,Python会创建一个本地变量,它遮盖了同名的全局变量。当func1()
返回并且该本地变量超出作用域时,它将被垃圾回收,同时func2()
只能看到全局名称(未修改)。请注意,此命名空间决策发生在编译时而不是运行时——如果您在分配给它之前在func1()
中读取_my_global
的值,则会出现UnboundLocalError
,因为Python已经决定它必须是本地变量,但尚未与任何值相关联。但是,使用“global
”语句告诉Python应在其他地方查找名称,而不是在本地分配它。
(我认为这种行为主要是通过优化本地命名空间而起源的——如果没有这种行为,Python的虚拟机每次在函数内部分配新名称时至少需要执行三次名称查找(以确保名称在模块/内置级别上不存在),这会显着减慢一个非常常见的操作。)
您可以通过在每个为其赋值的函数内将其声明为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
关键字明确选择其他行为。
如果您想跨模块共享全局变量,请参阅其他答案。