为什么我的lambdas不起作用?

bat*_*est 7 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)
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*024 9

在这段代码中:

for i in range(5):
    lambdas.append(lambda x:i*i*x)
Run Code Online (Sandbox Code Playgroud)

运行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)
Run Code Online (Sandbox Code Playgroud)

这会产生:

0
4
Run Code Online (Sandbox Code Playgroud)

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


Pad*_*ham 6

i4你的循环结束所以i每个是4 lambda.

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

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

print(i)
4
Run Code Online (Sandbox Code Playgroud)

您正在使用一个在整个循环中更新的变量,如果您在循环内调用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
Run Code Online (Sandbox Code Playgroud)

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

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

lambdas = [lambda x,i=i: i * i * x for i in xrange(5)]
Run Code Online (Sandbox Code Playgroud)