我努力让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有不同的价值。为什么会这样!
答案 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)
i
为4
,因此每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)]