python为什么在具有不同值的循环中定义的lambdas都返回相同的结果?
假设你使用for循环来定义几个不同的 lambda (甚至是普通函数),例如::
>>> squares=[]>>> forxinrange(5):
... squares.append(lambda:x**2)
这给你一个包含5个lambdas的列表,它们计算 x**2
。你可能会期望,当它们被调用时,它们将分别返回 0
、 1
、 4
、 9
和 16
。但是,当你真正尝试时,你会看到它们都返回 16
。:
>>> squares[2]()16
>>> squares[4]()
16
发生这种情况是因为 x
不是lambdas的内部变量,而是在外部作用域中定义,并且在调用lambda时访问它 - 而不是在定义它时。 在循环结束时, x
的值是 4
,所以所有的函数现在返回 4**2
,即 16
。你还可以通过更改 x
的值来验证这一点,并查看lambdas的结果如何变化:
>>> x=8>>> squares[2]()
64
为了避免这种情况,你需要将值保存在lambdas的局部变量中,这样它们就不依赖于全局``x`` 的值
>>> squares=[]>>> forxinrange(5):
... squares.append(lambdan=x:n**2)
这里, n=x
在lambda本地创建一个新的变量 n
,并在定义lambda时计算,使它具有与 x
在循环中该点相同的值。这意味着 n
的值在第一个lambda中为 0
,在第二个lambda中为 1
,在第三个中为 2
,依此类推。因此每个lambda现在将返回正确的结果:
>>> squares[2]()4
>>> squares[4]()
16
请注意,这种行为并不是lambda所特有的,但也适用于常规函数。
以上是 python为什么在具有不同值的循环中定义的lambdas都返回相同的结果? 的全部内容, 来源链接: utcz.com/z/520601.html