Python引用全局变量的赋值语句执行流程及报错原因解析
Python 引用全局变量的赋值语句执行流程与报错原因
核心前提:作用域判定发生在编译阶段,而非运行时
Python 处理函数内变量的核心规则是:在函数编译阶段就会完成所有变量的作用域标记,不会等到运行时逐行判断变量归属:
- 只要函数内部任意位置出现了对某变量的赋值操作,且没有显式加
global或nonlocal声明,编译器就会直接将该变量标记为局部变量,整个函数运行过程中,对这个变量的所有读写操作都会优先查找局部作用域,不会自动 fallback 到全局作用域。
func1 执行逻辑(符合预期)
编译func1时,检测到有x = 3的赋值操作,因此x被标记为局部变量。运行时先给局部变量x赋值3,再打印局部x的值,最终输出3。
func2 执行逻辑(不符合预期的原因)
你预期的执行流程是「先读全局x=2计算x+1,再赋值给局部x」,但不符合实际执行逻辑的核心原因是编译阶段已经修改了x的作用域标记:
- 编译
func2时,检测到有x = x + 1的赋值操作,因此x直接被标记为局部变量,整个函数内对x的读取不会再去全局作用域查找。 - 运行时执行赋值语句,确实遵循「先计算右侧表达式」的规则,但计算
x + 1时会读取局部作用域的x,此时局部x还没有完成赋值就被引用,因此抛出UnboundLocalError。
两种符合预期的修改方案
方案1:声明x为全局变量,直接修改全局x
如果你的需求是修改全局作用域的x,可以在函数开头加global声明,告诉编译器这个x是全局变量,不要标记为局部:
def func2(): global x x = x + 1 print(x)
运行后会输出3,同时全局的x也会被修改为3。
方案2:显式读取全局x,赋值给局部同名x
如果你的需求是读取全局x的值计算,再赋值给局部的同名x,可以通过globals()内置字典显式读取全局作用域的x:
def func2(): x = globals()['x'] + 1 print(x)
运行后输出3,全局的x仍然保持为2。
内容的提问来源于stack exchange,提问作者HoardingGold
相关产品推荐
相关产品推荐

