如何一个函数中使用全局变量?
可以在其他函数中使用全局变量,方法是在使用该变量的每个函数中将其声明为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
Code language: PHP (php)
由于不清楚globvar = 1是创建局部变量还是更改全局变量,Python 默认创建局部变量,此处使用global关键字显式选择其他行为。
Python 如何处理本地(函数)和全局(模块)命名空间
假设你有一个这样的模块:
# sample.py
_my_global = 5
def func1():
_my_global = 42
def func2():
print _my_global
func1()
func2()
Code language: PHP (php)
你可能希望会打印 42,但实际上打印 5。如果你向 中添加 ‘ global’ 声明func1(),则func2()将打印 42。
def func1():
global _my_global
_my_global = 42
Code language: PHP (php)
这里发生的事情是,
Python 假定分配给函数中任何位置的任何变量都是该函数的本地变量,除非显式说明。
如果它只是从一个变量中读取,并且该变量在本地不存在,它将尝试在任何包含范围(例如模块的全局范围)中查找该变量。
因此,当你将 42 分配给 _my_global
变量时,Python 会创建一个本地变量,这样就隐藏了同名的全局变量。在func1()返回时该本地变量超出范围并被垃圾收集;
同时,func2()除了(未修改的)全局变量之外,无法访问其它变量
请注意,这个命名空间决定发生在编译时,而不是运行时——如果你在分配给它之前在func1()中读取_my_global
的值,你会得到一个UnboundLocalError
,
因为 Python 已经决定它必须是一个局部变量,但是它还没有任何与之相关的价值。但是通过使用 ‘ global’ 语句,你告诉 Python 它应该在别处寻找变量,而不是在本地分配给它。
这种行为主要源于对本地命名空间的优化——如果没有这种行为,Python 的 VM 每次在函数内部分配一个新变量时都需要执行至少三个变量查找(以确保该变量没有t 已经存在于模块/内置级别),这将显着减慢非常常见的操作