在Python函数中使用全局变量


在Python函数中使用全局变量

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

globvar = 0

def set_globvar_to_one():
    global globvar    # 需要修改globvar的全局副本
    globvar = 1

def print_globvar():
    print(globvar)     # 无需全局声明来读取globvar的值

set_globvar_to_one()
print_globvar()       # Prints 1

实例

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

# sample.py
myGlobal = 5

def func1():
    myGlobal = 42

def func2():
    print myGlobal

func1()
func2()

你可能希望这打印42,但它打印5.如前所述,如果你添加'global'声明func1(),那么func2()将打印42。

def func1():
    global myGlobal
    myGlobal = 42

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

myGlobal因此,当您为名称指定42时,Python会创建一个局部变量,该变量将隐藏同名的全局变量。本地超出范围并在返回时被垃圾收集func1() ; 同时,func2()除了(未修改的)全局名称之外,什么都看不到。请注意,这个命名空间决定发生在编译时,而不是在运行时 - 如果你在分配它之前读取myGlobal内部的值func1(),你会得到一个UnboundLocalError,因为Python已经确定它必须是一个局部变量但是它还没有与之相关的任何价值。但是通过使用'global'语句,你告诉Python它应该在别处查找名称,而不是在本地分配它。