我定义了一些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
)或将新值赋给i
或k
时:
i = 256
k = 512
for j in range(3):
print(a[j](0))
输出为:
0
1
2