【问题标题】:Creating lambda expressions on the fly [duplicate]动态创建 lambda 表达式 [重复]
【发布时间】:2015-10-18 07:35:56
【问题描述】:
def multipliers():
  l = []
  for i in range(4):
    l.append(lambda x : x * i )
  return l

>>> ll[0](2)
6
>>> ll[1](2)
6
>>> ll[2](2)
6
>>> ll[3](2)
6

你能解释一下这里的结果吗?我希望得到:

0
2
4
6

【问题讨论】:

  • 相关:stackoverflow.com/questions/2295290/…(如何处理您的问题,请参阅第二个答案,以及第一个解释为什么会发生)
  • 虽然我不怪你没有发现这一点:尽管我知道存在这个问题,但我用 Google 尝试了四次。
  • site:stackoverflow.com python lambda 出现了几个好结果(包括那个)。
  • 正如线程中所指出的,解决此问题的一种简单方法是使用 i 作为 lambda 的默认参数:lambda x, i=i: x*i

标签: python python-2.7


【解决方案1】:

i 的值未存储在 lambda 函数中。这就是为什么你会得到你所看到的结果:Python 正在使用它在调用函数时找到的 i 的值。

【讨论】:

    【解决方案2】:

    原因是 Python 的闭包是late binding。这意味着在调用内部函数时会查找闭包中使用的变量的值。因此,当调用multipliers() 返回的任何函数时,i 的值会在当时的周围范围内查找。到那时,无论调用哪个返回函数,for 循环都已完成,i 的最终值为3。因此,每一个返回的函数都将其传递的值乘以3,所以由于上述代码中传递了2的值,所以它们都返回了6的值

    取自:http://www.toptal.com/python/interview-questions

    【讨论】:

      【解决方案3】:

      问题在于,正如人们所说,i 不是lambda 的局部变量。 您必须解决这个问题:使用循环期间更改的默认参数值:

      >>> def multipliers():
        l = []
        for i in range(4):
          l.append(lambda x, i=i : x * i )
        return l
      
      >>> lst = multipliers()
      >>> lst[0](2)
      0
      >>> lst[1](2)
      2
      >>> lst[2](2)
      4
      >>> lst[3](2)
      6
      >>> 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多