因为lambda中的i可能不是你所期望的.要验证这一点,请更改代码:
acts.append(lambda x: (i, i ** x))
现在打印告诉你i的值:
(4, 16)
(4, 16)
(4, 16)
(4, 16)
(4, 16)
这意味着lambda不复制i的值但保留对变量的引用,因此所有lambdas都看到相同的值.要解决此问题,请复制i:
acts.append(lambda x, i=i: (i, i ** x))
小i = i在lambda中创建了i的本地副本.
[编辑]现在为什么这样?在2.1之前的Python版本中,本地函数(即在其他函数内定义的函数)无法在同一范围内看到变量.
def makeActions():
acts=[]
for i in range(5):
print len(acts)
def f(x): #
return i ** x
acts.append(f)
print acts[i]
return acts
然后你会得到一个我没有定义的错误. lambda可以以一种有点奇怪的语法为代价来看待封闭的范围.
这种行为已在最新版本的Python(2.5,IIRC)中得到修复.使用这些旧版本的Python,您必须编写:
def f(x, i=i): #
return i ** x
自修复(参见PEP 3104)以来,f()可以看到同一范围内的变量,因此不再需要lambda.