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

Python闭包中赋值操作触发UnboundLocalError的原因咨询

Python闭包中赋值操作触发UnboundLocalError的原因咨询

这个问题我刚学Python闭包的时候也踩过一模一样的坑!咱们一步步拆解清楚:

首先得搞懂Python的变量作用域绑定规则:当你在一个函数内部对某个变量执行赋值操作(比如b +=1本质是b = b +1,属于赋值)时,Python会默认把这个变量标记为当前函数的局部变量——不管外层作用域有没有同名的变量。

那回到你的第一个代码片段:

def A():
    b = 1
    def B():
        b += 1
        return b
    return B()
print(A())

B函数里的b +=1触发了Python的局部变量判定,它会认为b是B自己的局部变量,但执行b = b +1的时候,右边的b还没被定义(因为局部的b还没赋值),所以就抛出了UnboundLocalError。这时候Python根本不会去外层闭包里找那个b=1的变量。

而第二个代码片段就不一样了:

def A():
    b = 1
    def B():
        return b + 1
    return B()
print(A())

这里B函数只是读取b的值来计算,没有对b做任何赋值操作,Python就会按照作用域链往上找,自然就找到了外层A函数里的b=1,所以能正常返回2。

你说的闭包环境{b ->1}确实存在,但Python默认不允许嵌套函数直接修改外层的普通变量——因为赋值操作会打破原有的作用域绑定。如果想要修改外层的b,只需要用nonlocal关键字告诉Python:“这个b不是当前函数的局部变量,去外层嵌套作用域找它”,修改后的代码就可以正常运行了:

def A():
    b = 1
    def B():
        nonlocal b
        b += 1
        return b
    return B()
print(A())  # 输出2

备注:内容来源于stack exchange,提问作者user29008294

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:05:29