为什么在循环中使用不同值的 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
广告