在他关于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列出的大致匹配。那么这里发生了什么?
答案 0 :(得分:1)
他们完成了不同的事情。前者返回返回数字的lambas列表,后者返回返回数字列表的lambda。您可以想象每种用例的不同用例。