在函数中使用全局变量
如何在函数中创建或使用全局变量?
如何在一个函数中与其他函数内使用定义的全局变量?
如何在函数中创建或使用全局变量?
如何在一个函数中与其他函数内使用定义的全局变量?
您可以在其他函数中使用全局变量,方法是将其声明为在为其赋值的每个函数中: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 = 1
global
如果要在模块之间共享全局变量,请参阅其他答案。
如果我正确地理解了你的情况,那么你所看到的是Python如何处理本地(函数)和全局(模块)命名空间的结果。
假设你有一个这样的模块:
# sample.py
_my_global = 5
def func1():
_my_global = 42
def func2():
print _my_global
func1()
func2()
您可能期望它打印 42,但实际上它打印 5。如前所述,如果向 中添加“”声明,则将打印 42。global
func1()
func2()
def func1():
global _my_global
_my_global = 42
这里发生的事情是,Python假设在函数内任何地方分配的任何名称都是该函数的本地名称,除非另有明确说明。如果它只是从名称读取,并且该名称在本地不存在,它将尝试在任何包含的作用域(例如模块的全局作用域)中查找该名称。
因此,当您为名称赋值 42 时,Python 会创建一个隐藏同名全局变量的局部变量。该本地超出范围,并在返回时被垃圾回收;同时,除了(未修改的)全局名称之外,永远看不到其他任何内容。请注意,此命名空间决策发生在编译时,而不是在运行时 - 如果您在分配给它之前读取inside的值,您将获得一个,因为Python已经决定它必须是一个局部变量,但它还没有与之关联的任何值。但是通过使用''语句,你告诉Python它应该在其他地方寻找名称,而不是在本地分配给它。_my_global
func1()
func2()
_my_global
func1()
UnboundLocalError
global
(我相信这种行为主要起源于对本地命名空间的优化 - 如果没有这种行为,每次将新名称分配给函数内部时,Python的VM都需要至少执行三次名称查找(以确保该名称在模块/内置级别尚不存在),这将大大减慢非常常见的操作。