匿名函数lambda
“为什么在循环内部定义的lambda函数,对于不同的输入,最后会返回同一个值?”
例如:对于以下代码:

当输入print(squares[2]( ))与print(squares[4]( ))时,得到的结果均为16,如下图所示:

这是Python Documentation上的一个问题,以下是我参考官方回答后自己的一些分析。
为了让代码更清晰,将内部的lambda函数改写为一般的函数:
squares = [ ]
for x in range(5):
def f( ):
return x**2
squares.append(f)
分析循环内部的语句,该循环最终会得到一个包含5个函数的列表squares,当执行列表中的第二个函数( squares[2]( ) )时,将返回x**2,由于x在lambda函数外部定义,属于全局变量,而此时经过循环之后x的取值已经变为4,因此输出的结果为16,并且对于squares中的任何一个函数,最终返回的数值均相同。
为解决这一问题,可在进行循环之时将x的值赋给一局部变量n,并返回n**2,这样可保证最终列表中每个函数返回的数值不同。具体代码及分析过程如下:

同样对内部lambda函数进行改写:
squares = [ ]
for x in range(5):
def f(n=x):
return n**2
squares.append(f)
与之前的lambda函数不同,此匿名函数需接受一个参数,若无输入参数,则将其默认值设为x。在进行循环的过程中,x的值会即时传递给n,因此得到的函数列表中的第二个函数(squares[2] )为:
def f(n=2):
return n**2
在调用squares[2]( )时,由于函数无输入,故采用其默认值2,因此最终得到的结果为4,同理,squares [4]( )的结果为16:


浙公网安备 33010602011771号