为什么Python循环中定义的lambda函数返回相同的结果?

为什么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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程