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

Python中列表内Lambda调用结果不一致问题咨询

Lambda闭包延迟绑定导致的结果差异

先看代码运行后的实际表现:

l1 = [(lambda: j) for j in range(2)]
l2= [lambda:0, lambda: 1]
l3 = [(lambda: j)() for j in range(2)]
print(l1)
# 输出类似: [<function <lambda> at 0x7f9b1c0b3e50>, <function <lambda> at 0x7f9b1c0b3ee0>]
print(l2)
# 输出类似: [<function <lambda> at 0x7f9b1c0b3f70>, <function <lambda> at 0x7f9b1c0b4000>]
print(l1[0]())  # 输出: 1
print(l2[0]())  # 输出: 0
print("l3: ", l3)  # 输出: l3:  [0, 1]

核心原因:Python闭包的变量延迟绑定

  • l1的问题:列表推导里的每个lambda都是闭包,它们不会在定义时捕获循环中j的当前值,而是在调用lambda的时候才去查找j的当前值。当整个循环结束后,j的最终值是1(因为range(2)循环两次,最后一次j被赋值为1),所以不管调用l1里的第几个lambda,都会取到j的最终值1。
  • l2的逻辑:每个lambda直接返回固定的字面量(0或1),没有引用外部变量,所以调用时直接返回定义时的固定值,结果符合预期。
  • l3的逻辑:这里的lambda在列表推导过程中就被立即执行了(末尾加了()),所以每次循环时,j的当前值(第一次是0,第二次是1)会被立刻计算并返回,最终l3存储的是调用后的结果列表[0,1],而不是lambda函数对象。

为什么打印l1和l2看起来一致?

打印lambda函数对象时,Python只会输出它的类型和内存地址,不会展示函数内部的逻辑(比如引用了哪个变量、返回什么内容),所以表面上都是lambda函数列表,但内部的变量绑定逻辑完全不同,调用时自然会得到不同结果。

内容的提问来源于stack exchange,提问作者Simon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 12:43:11