尝试这样的事情时我有点困惑
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
它工作正常,但第一个代码有什么问题?
尝试这样的事情时我有点困惑
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
它工作正常,但第一个代码有什么问题?
这是由于Python 中的闭包是如何工作的。
循环更改所有函数共享范围内的值。将函数的生成移到单独的范围内,即函数。
这是一个范围游戏。
在第一个代码中,lambda 中的“i”名称只是一个引用。该引用后面的值会随着 for 循环的执行而改变。
在第二个代码中,有两个不同的范围。