【问题标题】:In Python, why do lambdas in list comprehensions overwrite themselves in retrospect? [duplicate]在 Python 中,为什么列表推导中的 lambda 回想起来会覆盖自己? [复制]
【发布时间】:2015-09-15 21:03:35
【问题描述】:

考虑以下代码:

def f (a):
    return 1
def g (a):
    return 2

[lambda a: i(a) for i in (f,g)][0](0)

结果是 2。显然应该是 1!我希望这段代码执行如下。创建一个列表。将函数 f 复制到第一个索引中。将 g 复制到第二个索引中。鳍。

为什么会这样执行?!

【问题讨论】:

    标签: python list function lambda list-comprehension


    【解决方案1】:

    lambda 没有覆盖自己,它是 i 被覆盖了。这是关于变量范围的常见错误。试试这个:

    [lambda a, i=i: i(a) for i in (f,g)][0](0)
    

    (区别在于在创建 lambda 时绑定了 i 的值)

    另见:

    【讨论】:

      【解决方案2】:

      我会稍微扩展@dsh 的回答。

      当列表推导表达式

      [lambda a: i(a) for i in (f,g)]
      

      被评估,它创建两个匿名函数,每个函数的作用是

      def _______(a):
          return i(a)
      

      但是,在对上述列表推导进行评估之后,名称 i 绑定到其最后一个迭代值,即绑定到 g 的对象,即您的第二个函数。

      现在,在那之后,当列表中的一个匿名函数被调用时,它会访问名称i,它在模块全局范围内并绑定到与g 相同的是


      编辑:哦,@dsh 也扩展了它。

      【讨论】:

        猜你喜欢
        • 2014-04-19
        • 1970-01-01
        • 2021-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-02
        • 2011-04-19
        相关资源
        最近更新 更多