为什么在循环中使用不同值的 Python lambda 函数都返回相同的结果?


在了解为什么在循环中使用不同值的 Python lambda 函数都返回相同的结果之前,让我们先了解一下 Lambda。

Python Lambda

Lambda 表达式允许定义匿名函数。Lambda 函数是一个匿名函数,即没有名称的函数。让我们看看语法:

lambda arguments: expressions

关键字 lambda 定义了一个 lambda 函数。lambda 表达式包含一个或多个参数,但只能有一个表达式。

示例

让我们看一个例子

myStr = "Thisisit!" (lambda myStr : print(myStr))(myStr)

输出

Thisisit!

Python lambdas 在循环中使用不同的值,但都返回相同的结果

现在让我们了解一下为什么在循环中使用不同值的 Python lambda 函数都返回相同的结果。

假设我们要找到平方。使用 for 循环定义一些不同的 lambda 函数:

squares = [] for a in range(5): squares.append(lambda: a**2)

这将为您提供一个包含 5 个 lambda 函数的列表,这些函数计算 a**2。调用时,它们应该返回 0、1、4、9 和 16。但是,实际上它们都返回 16,如下所示:

squares = [] for a in range(5): squares.append(lambda: a**2) print(squares[2]())

输出

16

现在,尝试使用其他值运行它。它会给出相同的结果:

squares = [] for a in range(5): squares.append(lambda: a**2) print(squares[4]())

输出

16

您得到类似的输出,因为 x 不是 lambda 函数的局部变量,而是在外部作用域中定义的,并且在调用 lambda 函数时访问它,而不是在定义时访问它。

在循环结束时,x 的值为 4,因此所有函数现在都返回 4**2,即 16。通过更改 x 的值并查看 lambda 函数的输出如何变化来验证这一点:

squares = [] for a in range(5): squares.append(lambda: a**2) a = 8 print(squares[2]())

为了避免这种情况,将值保存在 lambda 函数的局部变量中,这样它们就不会依赖于全局变量 a 的值:

squares = [] for a in range(5): squares.append(lambda n=a: n**2)

这里,n=x 创建了一个新的局部变量 n,并在定义 lambda 函数时计算,以便它具有 a 在循环中该点处的相同值。这意味着第一个 lambda 函数中 n 的值为 0,第二个为 1,第三个为 2,依此类推。

因此,每个 lambda 函数现在都将返回正确的结果:

squares = [] for a in range(4): squares.append(lambda n=a: n**2) print(squares[2]())

输出

4

让我们看看其他一些值:

squares = [] for a in range(5): squares.append(lambda n=a: n**2) print(squares[4]())

输出

16

更新于: 2022-09-19

75 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始
广告