Python中local与global变量相关代码运行结果差异问题求解释
核心原因:Python 函数的变量作用域是在编译阶段静态判定的,不是运行时逐行判定的
Python 编译函数代码的阶段,只要函数内部任意位置出现了对某个变量的赋值操作(没有显式声明 global/nonlocal 的前提下),就会把这个变量标记为当前函数的局部变量,后续所有对该变量的访问都会优先找局部作用域的变量,不会回退到全局作用域查找。
第一个报错代码的运行逻辑
def callme(): print(x) x=20 x=10 callme()
- 编译
callme函数时,检测到函数内有x=20的赋值语句,因此直接将x标记为callme的局部变量。 - 调用
callme执行到print(x)时,程序只会查找局部作用域的x,但此时局部的x还没有完成赋值,因此直接抛出UnboundLocalError: local variable 'x' referenced before assignment错误。
第二个正常运行代码的运行逻辑
def callme(): print(x) x=10 callme()
- 编译
callme函数时,检测到函数内部没有对x的赋值操作,因此判定x属于上层作用域的变量。 - 调用
callme执行到print(x)时,程序向上查找到全局作用域的x=10,因此正常输出10。
如果要让第一个代码也能正常访问全局x,需要显式声明x是全局变量,修改后代码如下:
def callme(): global x print(x) x=20 x=10 callme() # 输出10,运行后全局x的值会被修改为20
内容的提问来源于stack exchange,提问作者Sherly Noel
相关产品推荐
相关产品推荐

