匿名函数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:

       

      

       

       

posted @ 2017-08-08 13:17  super_super  阅读(326)  评论(0)    收藏  举报