首页 > 解决方案 > `x = 42; x = lambda: x` 已解析?

问题描述

我很惊讶这个断言失败了:

x = 42
x = lambda: x
assert x() == 42

似乎x最终以递归方式引用自身,因此x(),x()()等都是函数。

用于解析这个的规则是什么,这个记录在哪里?

顺便说一下(上面没有意外地给出),原始值x在 lambda 定义之后没有留下任何引用:

class X:
  def __del__(self): print('deleting')

x = X()
x = lambda: x  # 'deleting' is printed here

标签: pythonlanguage-lawyer

解决方案


该变量x由第一个赋值创建,并与第二个赋值重新绑定。

由于x在调用 lambda 之前不会评估 lambda 中的 ,因此调用它将评估为最近分配的值。

请注意,这不是动态范围 - 如果它是动态的,则以下将打印“99”,但它会打印“<function ...”:

x = 42
x = lambda: x

def test(f):
  x = 99
  print(f())

test(x)

推荐阅读