为什么我的lambdas不起作用?

时间:2015-03-25 00:58:33

标签: python python-3.x

我努力让lambdas工作。这里的代码是示例,但它很好地显示了我的问题。

lambdas = list()

for i in range(5):
    lambdas.append(lambda x:i*i*x)


print lambdas[0](1)
print lambdas[2](1)

这给了我16,但我希望不同的lambda有不同的价值。为什么会这样!

2 个答案:

答案 0 :(得分:9)

在此代码中:

for i in range(5):
    lambdas.append(lambda x:i*i*x)

当函数运行时,确定i的值。函数定义i的值丢失。

改为使用:

lambdas = list()

for i in range(5):
    lambdas.append(lambda x, i=i : i*i*x)  

print lambdas[0](1)
print lambdas[2](1)

这会产生:

0
4

这是有效的,因为作为一种特殊情况,函数的默认参数(如上面的i=i中)会立即绑定。

答案 1 :(得分:6)

当你的循环结束时,

i4,因此每i lambda为4。

如果在循环外打印i,您会看到它是4:

for i in range(5):
    lambdas.append(lambda x: i * i * x)

print(i)
4

您正在使用一个在整个循环中更新的变量,如果您在循环中调用lambda,您将得到您期望的结果。

for i in range(5):
    lambdas.append(lambda x: i * i * x)
    print(lambda x: i * i * x)(1)
0
1
4
9
16

行为就是你所期望的,i只是一个变量,就像其他任何变量一样。

在旁注中,您可以使用list comp来创建列表:

lambdas = [lambda x,i=i: i * i * x for i in xrange(5)]