Python全局与局部作用域疑问:UnboundLocalError成因解析
Python中UnboundLocalError的成因解析
先复现你的代码:
var = 100 def function(): print(f"Printing var from outer_func(): {var}") var = 1 # 注释掉这行就不会报错 function()
核心原因:Python的作用域在函数定义阶段就已确定,而非执行阶段
Python的代码执行不是单纯逐行运行,而是分两个关键阶段:
- 编译阶段:当Python解析到函数定义时,会扫描整个函数体的代码。只要发现函数内部有对某个变量的赋值操作(比如这里的
var = 1),就会直接把这个变量标记为该函数的局部变量,不管赋值语句在函数里的位置是前还是后。 - 执行阶段:当函数运行到
print语句时,会优先在当前函数的局部作用域查找var。但此时var还没被赋值(赋值语句在后面),所以直接抛出UnboundLocalError,根本不会去全局作用域找那个var = 100。
注释掉赋值语句为何正常?
如果把var = 1注释掉,函数体里没有任何对var的赋值操作。这时候Python在编译阶段不会把var标记为局部变量,执行print时就会按照作用域链,去全局作用域找到已经定义的var = 100,自然就能正常打印。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

