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
相关产品推荐
相关产品推荐

