【问题标题】:List comprehension and functions列表理解和函数
【发布时间】:2011-01-16 17:42:00
【问题描述】:

尝试这样的事情时我有点困惑

b = [lambda x:x**i for i in range(11)]

当我尝试b[1](2) 时,结果是错误的 1024。但是当我这样写的时候

b = [(lambda i: lambda x:x**i)(i) for i in range(11)]

一切正常

>>> b[1](2)
2
>>> b[5](2)
32

它工作正常,但第一个代码有什么问题?

【问题讨论】:

  • 您的问题不是重复的,但推理与[this question]的答案相同。 [这个问题]:stackoverflow.com/questions/2222466/…“这个问题。”
  • 请注意,lambda x, i=i: x**i 可能是一种更自然的方式来编写您的短语 lambda i: lambda x:x**i)(i)。定义函数时计算默认参数。
  • -1:与lambda 搏斗的时间太多。如果 lambda 似乎不起作用,只需删除 lambda 并使用定义的函数。

标签: python list function list-comprehension


【解决方案1】:

这是由于how closures in Python work

循环改变所有函数共享范围内的值。将函数的生成移到单独的范围内,即函数。

【讨论】:

    【解决方案2】:

    这是一场范围游戏。

    在第一个代码中,lambda 中的“i”名称只是一个引用。该引用后面的值会随着 for 循环的执行而改变。

    在第二个代码中,有两个不同的作用域。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 2012-11-12
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多