我有一个下面列出的代码。我不知道为什么回报应该是4
def create_multiplier():
return [lambda x: x*i for i in range(10)]
f = create_multiplier()
print f[1](1)
结果结果是4.我熟悉lambda函数,比如lambda x:x * 2,但对此非常困惑。例如,它似乎得到了i的最后一次迭代:
for i in range(5):
i
print i
答案 0 :(得分:4)
在Python中,当外部函数结束时,闭包变量的值被冻结,而不是在创建内部函数时。是的,它使用i
的最后一个值。为避免这种情况,您可以使用默认参数:
return [lambda x, i=i: x*i for i in range(10)]
编辑:作为评论说明,闭包变量在技术上并未冻结,只是在你的情况下没有任何改变它的方法。但还有其他情况可以改变。