本文介绍了列表理解中的奇怪lambda行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用列表推导中的lambda函数,并且发现了一些奇怪的行为

I'm playing with lambda functions inside of list comprehension, and found some weird behaviour

x = [(lambda x: i) for i in range(3)]

print(x[0](0)) #print 2 instead of 0
print(x[1](0)) #print 2 instead of 1
print(x[2](0)) #print 2

有人可以解释为什么结果不是我所期望的吗?

Can someone explain why the result is not that I expect?

推荐答案

lambda s绑定变量本身,而不是绑定变量的值.在列表理解的末尾,i更改为2,因此所有lambda都在那一刻指的是i,因此指的是2.

lambdas bind variables themselves, not the values that they had. i is changed to 2 at the end of the list comprehension, so all the lambdas refer to i at that point, and thus refer to 2.

为避免这种情况,您可以使用默认参数把戏:

To avoid this, you can use the default argument trick:

[lambda x,i=i:i for i in range(3)]

这会将i的值绑定到默认参数(在函数定义时评估).

This binds the value of i in the default argument (which is evaluated at function definition time).

这篇关于列表理解中的奇怪lambda行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-06 09:45