在函数中使用全局变量

19 浏览
0 Comments

在函数中使用全局变量

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

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


在适当的地方未使用global关键字通常会导致UnboundLocalError。关于此的详细规则请参见UnboundLocalError on local variable when reassigned after first use。通常,在寻求解释时,请将其他问题视为该问题的重复,将该问题视为仅需了解global关键字的问题。

admin 更改状态以发布 2023年5月24日
0
0 Comments

如果我正确理解了您的情况,您看到的结果是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的虚拟机每次在函数内部分配新名称时至少需要执行三次名称查找(以确保名称在模块/内置级别上不存在),这会显着减慢一个非常常见的操作。)

0
0 Comments

您可以通过在每个为其赋值的函数内将其声明为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关键字明确选择其他行为。

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

0