You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:10:10