3 回答

TA贡献1864条经验 获得超6个赞
我猜想您在列表推导中创建的lambda绑定到变量i,最终变量i最终为5。因此,当您在事后求值时,lambda全部绑定为5并最终计算25.在第二个示例中,num也发生了同样的事情。当您评估循环内的lambda时,num的值没有改变,因此您获得了正确的值。循环后,num为5 ...
我不太确定您要做什么,所以不确定如何提出解决方案。这个怎么样?
def square(x): return lambda : x*x
listOfLambdas = [square(i) for i in [1,2,3,4,5]]
for f in listOfLambdas: print f()
这给了我预期的输出:
1
4
9
16
25
另一种思考方式是,lambda在创建时就“捕获”其词法环境。因此,如果您给它num,它直到被调用时才真正解析该值。这既混乱又强大。

TA贡献1712条经验 获得超3个赞
你有:
listOfLambdas = [lambda: i*i for i in range(6)]
for f in listOfLambdas:
print f()
输出:
25
25
25
25
25
25
您需要粗鲁!除了美味之外,请使用此默认值“ hack”。
listOfLambdas = [lambda i=i: i*i for i in range(6)]
for f in listOfLambdas:
print f()
输出:
0
1
4
9
16
25
注意i=i。那就是魔术发生的地方。
添加回答
举报