当我更改lambda函数中的变量名时,结果发生了变化



我定义了一些lambda并尝试执行它们。这些是我定义的lambda函数。

a = []
for i in range(3):
a.append(lambda a:i+a)

当我执行以下代码时:

for j in range(3):
print(a[j](0))

结果如下:

2
2
2

但是当我改变变量名并做同样的事情时:

for i in range(3):
print(a[i](0))

我不能得到相同的结果:

0
1
2

我不明白为什么会这样…

您没有将变量的值保存在lambda中。您将保存在lambda之外定义的变量。它不一定是一个全局变量,但对于lambda的作用域,它是在它的外部声明的。迭代结束时,i的值为2。这就是为什么当你使用j迭代for循环时,lambda内部的值总是2

当您使用i变量迭代for循环时,您将在执行lambda之前再次更改i的状态。这就是为什么它给你一个不同的结果。

要使lambda只获得变量的值,而不使其依赖于任何变量作用域,可以这样做:

a = []
for i in range(3):
a.append((lambda k: lambda x:(k+x))(i))

lambda k: ...用于将i的状态传递给内部lambda。它实际上是在执行函数,并返回lambda x: (k+x),其中k是lambda作用域的私有变量。

现在,当您尝试使用另一个变量(例如j)或将新值赋给ik时:

i = 256
k = 512
for j in range(3):
print(a[j](0))

输出为:

0
1
2

最新更新