问题是我期望下面的三个列表在调用时是相同的,但是l2和l3彼此相等,l1不同
l1 = [(lambda: j) for j in range(2)]
l2= [lambda:0, lambda: 1]
l3 = [(lambda: j)() for j in range(2)]
print(l1)
print(l2)
print(l1[0]())
print(l2[0]())
print("l3: ", l3)
另外,当我打印出 l1 和 l2 (未调用)时,我得到完全相同的 lambda 对象列表,但它们在调用时是不同的。发生什么事了?
l1 = [(lambda: j) for j in range(2)]
这里
j
是列表理解范围内的变量,因此它对于理解循环的两次迭代都是“活动的”,但是当该循环完成时,j
等于 1
,因此两个 lambda 将返回相同的值j
的值。
l2 = [lambda: 0, lambda: 1]
这里有两个具有具体返回值的 lambda。这里没有发生任何有趣或棘手的事情。
l3 = [(lambda: j)() for j in range(2)]
在这里,您在每次理解迭代中构造 并调用 lambda,因此您不会直接存储
j
的值,而是存储 lambda 的返回值。这就是为什么此代码不会像 j
示例那样“记住” l1
的最后一个值。