列表理解和功能

时间:2010-02-14 16:40:51

标签: python list function list-comprehension

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

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

它工作得很好,但第一段代码出了什么问题?

2 个答案:

答案 0 :(得分:3)

这是由于how closures in Python work

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

答案 1 :(得分:1)

这是范围游戏。

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

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