尝试这样的事情时,我有点困惑
b = [lambda x:x**i for i in range(11)]
然后当我尝试b[1](2)
时,我有1024因为错误。但是当我这样写的时候
b = [(lambda i: lambda x:x**i)(i) for i in range(11)]
一切正常
>>> b[1](2)
2
>>> b[5](2)
32
它工作得很好,但第一段代码出了什么问题?
答案 0 :(得分:3)
这是由于how closures in Python work。
循环更改 all 函数共享范围内的值。将函数的生成移动到单独的范围,即函数。
答案 1 :(得分:1)
这是范围游戏。
在第一个代码中,lambda中的“i”名称只是一个引用。随着for循环的执行,该引用背后的值会发生变化。
在第二个代码中,有两个不同的范围。