为什么要在列表推导中包含整个`lambda`表达式?

时间:2018-04-14 19:58:19

标签: python lambda list-comprehension

在他关于Python编程错误的writeup中,Martin Chikilian包含以下内容,以说明关于闭包内变量生命周期的误解:

def create_multipliers():
    return [lambda x: i * x for i in range(5)]

for multiplier in create_multipliers():
    print(multiplier(2))

对于某些人来说,输出是令人惊讶的,因为i在调用multiplier之间的闭包中保持其最终值(4)。马丁包括一个黑客来获得所需的输出(请参阅他的文章了解详情)。

我想知道的是通过将整个lambda包含在列表理解中来实现的目标是什么?它是科学计算等领域的常用习语吗?因为,对我来说,以下内容更容易理解:

def create_multiplier():
    return lambda x: [i * x for i in range(5)]

multiplier = create_multiplier()
print(multiplier(2))

输出: [0,2,4,6,8]

第二版的输出与Martin列出的大致匹配。那么这里发生了什么?

1 个答案:

答案 0 :(得分:1)

他们完成了不同的事情。前者返回返回数字的lambas列表,后者返回返回数字列表的lambda。您可以想象每种用例的不同用例。