1

尝试这样的事情时我有点困惑

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

它工作正常,但第一个代码有什么问题?

4

2 回答 2

3

这是由于Python 中的闭包是如何工作的

循环更改所有函数共享范围内的值。将函数的生成移到单独的范围内,即函数。

于 2010-02-14T16:45:49.470 回答
1

这是一个范围游戏。

在第一个代码中,lambda 中的“i”名称只是一个引用。该引用后面的值会随着 for 循环的执行而改变。

在第二个代码中,有两个不同的范围。

于 2010-02-14T16:48:33.210 回答