为什么Python3.8+嵌套lambda中使用:=会将变量视为局部变量?
Python嵌套lambda海象运算符报错原因解析
- 首先明确Python的函数作用域默认规则:只要函数(包括
lambda匿名函数)内部存在对某个变量的赋值操作,Python解释器会在编译阶段就将该变量标记为该函数的局部变量,除非显式使用nonlocal/global关键字声明变量的作用域。 - 第一段代码运行正常的原因:内层
lambda仅对result做读取操作,没有赋值行为,因此解释器不会将result判定为内层局部变量,会自动向上到外层lambda的作用域查找result变量,成功读取到初始值0后计算返回1,运行无异常。 - 第二段代码报错的核心原因:海象运算符
:=属于赋值操作,内层lambda中出现result := result + 1代码后,解释器直接将result标记为内层lambda的局部变量。运行时首先计算赋值语句右侧的result + 1,此时尝试读取内层局部变量result,但该变量还未完成赋值,因此触发UnboundLocalError。
你可以用普通def函数复现完全一致的逻辑,更便于理解规则:
def outer(result): def inner(): # 存在赋值操作,result被判定为inner的局部变量 return result := result + 1 return inner counter = outer(0) counter() # 同样抛出UnboundLocalError
额外说明:lambda内部不支持写
nonlocal/global这类声明语句,因此如果需要实现可修改外层变量的计数器逻辑,不适合用嵌套lambda实现,改用普通def定义函数并添加nonlocal result声明即可解决报错。
内容的提问来源于stack exchange,提问作者sholdNotBeAskingThis
相关产品推荐
相关产品推荐

