lambda的列表理解返回相同的值

时间:2016-01-25 16:18:17

标签: python python-3.x lambda list-comprehension

我在某个地方找到了这个例子,我无法理解。

>>> mult = [lambda x:x*i for i in range(4)]
>>> mult
[<function <listcomp>.<lambda> at 0xb6823464>, <function <listcomp>.<lambda> at 0xb682341c>, <function <listcomp>.<lambda> at 0xb68234f4>, <function <listcomp>.<lambda> at 0xb682353c>]
>>> [m(2) for m in mult]
[6, 6, 6, 6]
>>> 

正如我所看到的,第一行创建了一个lambda函数列表,我可以在之后调用它们。我不明白的是[6,6,6,6]的输出。我可以看到,mult的元素位于内存的不同部分,因此,这些不是对同一数据块的几个引用。但为什么他们会产生相同的结果呢?所有这些函数都引用相同的i(最后一个,即3),为什么会发生这种情况?有没有一种快速的方法来制作这样的lambdas列表,而不是产生[0,2,4,6]

1 个答案:

答案 0 :(得分:1)

i未绑定在lambda的正文中;调用函数后会查找其值,因此您将创建一个包含4个相同函数的列表。在Python 2中,列表解析的索引“泄漏”,因为没有创建新的作用域。当您致电每个m时,每个人都会看到相同的i值,这是在理解中分配的最后一个值i

解决方案是强制i在每个函数的主体中取一个特定值。这可以通过使用“do-nothing”参数来完成,该参数的唯一目的是使用其默认值。

mult = [lambda x, i=i:x*i for i in range(4)]