在函数中使用全局变量

2022-09-05 00:42:30

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

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


答案 1

您可以在其他函数中使用全局变量,方法是将其声明为在为其赋值的每个函数中: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

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

如果要在模块之间共享全局变量,请参阅其他答案。


答案 2

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

假设你有一个这样的模块:

# sample.py
_my_global = 5

def func1():
    _my_global = 42

def func2():
    print _my_global

func1()
func2()

您可能期望它打印 42,但实际上它打印 5。如前所述,如果向 中添加“”声明,则将打印 42。globalfunc1()func2()

def func1():
    global _my_global 
    _my_global = 42

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

因此,当您为名称赋值 42 时,Python 会创建一个隐藏同名全局变量的局部变量。该本地超出范围,并在返回时被垃圾回收;同时,除了(未修改的)全局名称之外,永远看不到其他任何内容。请注意,此命名空间决策发生在编译时,而不是在运行时 - 如果您在分配给它之前读取inside的值,您将获得一个,因为Python已经决定它必须是一个局部变量,但它还没有与之关联的任何值。但是通过使用''语句,你告诉Python它应该在其他地方寻找名称,而不是在本地分配给它。_my_globalfunc1()func2()_my_globalfunc1()UnboundLocalErrorglobal

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