python为什么在具有不同值的循环中定义的lambdas都返回相同的结果?

python

假设你使用for循环来定义几个不同的 lambda (甚至是普通函数),例如::

>>>

>>> squares=[]

>>> forxinrange(5):

... squares.append(lambda:x**2)

这给你一个包含5个lambdas的列表,它们计算 x**2 。你可能会期望,当它们被调用时,它们将分别返回 014916 。但是,当你真正尝试时,你会看到它们都返回 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

回到顶部