为什么使用“:=”时,嵌套 lambda 中的变量被视为本地变量?

0 python python-3.x

为什么 python3.8+ 在使用 := 时将结果视为嵌套 lambda 中的局部变量,但在其他情况下则不然?

>>> counter = (lambda result: (lambda: (result + 1)))(0)
>>> counter()
1
>>> counter = (lambda result: (lambda: (result := result + 1)))(0)
>>> counter()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
UnboundLocalError: local variable 'result' referenced before assignment
Run Code Online (Sandbox Code Playgroud)

che*_*ner 5

由 创建的变量的作用域规则:=与它们的作用域规则相同=(只要不涉及理解)。result := result + 1创建一个名为的新局部变量,result该变量隐藏外部函数的参数。由于result在赋值表达式之前未定义,因此尝试计算result + 1会产生NameError.

由于无法nonlocal在 lambda 表达式中使用语句,因此无法result使用简单的赋值来更新外部函数变量的值。(虽然您可以将某些内容与该exec函数一起破解,但我建议不要这样做,并且不会在此处显示如何执行此操作的示例。)