这个问题是经典的“陷阱”,是在lambda函数被调用之前,不会查找i
lambda函数中引用的内容。当时的值是结束时绑定到的最后一个值,即。i``for-loop``2
如果绑定i
到lambda
函数定义中的默认值,则每个函数都i
将成为局部变量,并且在 定义 而不是调用lambda时,将评估其默认值并将其绑定到该函数。
因此,当调用lambda时,i
现在在 本地范围内 查找,并使用其默认值:
In [177]: bases = [lambda x, i=i: x**i for i in range(3)]
In [178]: print([b(5) for b in bases])
[1, 5, 25]
以供参考: