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

Python装饰器作用域触发UnboundLocalError问题咨询

错误原因

该报错是Python的变量作用域编译规则导致的:

  • Python在编译函数阶段,会扫描函数内的所有赋值操作,把被赋值的变量默认标记为当前函数的局部变量,和赋值操作的执行顺序无关。
  • 你的inner函数中存在x = 1的赋值语句,所以Python判定x是inner的局部变量,执行if x == 2时尝试读取还未赋值的局部变量x,就会抛出UnboundLocalError。
  • 当你把赋值语句替换为print(x)时,inner内没有对x的赋值操作,Python不会把x标记为inner的局部变量,就会自动向上层decorator函数的作用域查找参数x,因此可以正常运行。
修复方法

如果需要在内部函数修改外层函数的变量,需要用nonlocal关键字声明变量不属于当前函数的局部作用域:

def decorator(x):
    def inner(f):
        nonlocal x
        if x == 2:
            x = 1
        return f
    return inner

@decorator(2)
def f():
    pass

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:54:04