为什么Python循环中定义的lambda函数返回相同的结果?
在了解Python循环中定义的lambda函数为什么返回相同的结果之前,让我们先学习lambda函数。
阅读更多:Python 教程
Python Lambda函数
Lambda是一种允许定义匿名函数的表达式。lambda函数是一种没有名称的匿名函数。让我们看看它的语法—
lambda 参数: 表达式
关键字lambda定义了lambda函数。lambda表达式含有一个或多个参数,但只能有一个表达式。
例子
让我们看一个例子
myStr = "Thisisit!"
(lambda myStr : print(myStr))(myStr)
输出
Thisisit!
Python循环中定义的lambda函数返回相同结果
现在让我们了解一下为什么Python循环中定义的lambda函数返回相同的结果。
假设我们正在寻找平方数。使用for循环定义几个不同的lambda函数—
squares = []
for a in range(5):
squares.append(lambda: a**2)
这会给您一个包含5个计算a**2的lambda函数的列表。当被调用时,它们应该返回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
squares = []
for a in range(5):
squares.append(lambda: a**2)
a = 8
print(squares[2]())
为了避免这种情况,需要将值保存在局部变量中,这样它们不依赖于全局变量a−
squares = []
for a in range(5):
squares.append(lambda n=a: n**2)
在这里,n=x创建了一个新的变量n作为lambda的本地变量,并在定义lambda时计算,以使它具有在循环中该点处a具有的相同值。这意味着第一个lambda的值为0,第二个lambda的值为1,第三个lambda的值为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
极客教程