Python小知识: 如何在函数中创建或使用全局变量?

python global 变量

如何一个函数中使用全局变量?

可以在其他函数中使用全局变量,方法是在使用该变量的每个函数中将其声明为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 1Code 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 = 42Code language: PHP (php)

这里发生的事情是,
Python 假定分配给函数中任何位置的任何变量都是该函数的本地变量,除非显式说明。
如果它只是从一个变量中读取,并且该变量在本地不存在,它将尝试在任何包含范围(例如模块的全局范围)中查找该变量。

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

这种行为主要源于对本地命名空间的优化——如果没有这种行为,Python 的 VM 每次在函数内部分配一个新变量时都需要执行至少三个变量查找(以确保该变量没有t 已经存在于模块/内置级别),这将显着减慢非常常见的操作

发表评论