【问题标题】:Outer scope variable in lambda functionlambda函数中的外部范围变量
【发布时间】:2017-01-30 10:19:34
【问题描述】:

为什么在 python 中

[f() for f in [lambda: d for d in [1,2]]]

给了

[2, 2]

为什么结果与其他语言不同(结果是 [1,2] 符合预期)? 这种不明显的行为有一些合理的原因吗?

【问题讨论】:

标签: python lambda scope garbage-collection


【解决方案1】:

在这个[lambda d: for d in [1,2]]你拥有的是

“将d从1运行到2,给我一个函数,在函数被调用的那一刻返回d的值。”

构造完这两个函数的列表后,您调用[f() for f in that list]。在调用函数的那一刻,d in [1,2] 已经完成,d 有它的最终值,2。所以这两个函数都返回2。

获得不同结果的一种方法是将d 复制到您创建的每个 lambda 函数的变量中。最简单的方法是:

[f() for f in [lambda x=d: x for d in [1,2]]]

这里每个lambda都有自己的x默认值,即在创建函数时d。

【讨论】:

  • 几秒钟后 ;-) +1
  • 好的,谢谢。我的主要问题是 为什么 而不是 如何 它工作。我只知道原因可能与神秘的短语lexical scope有关
  • 当您创建引用局部变量的 lambda 函数时,它不会复制该变量以供 lambda 函数使用;它引用了命名变量。在这种情况下,该命名变量在调用 lambda 函数时肯定具有值 2。或者换一种说法,你的两个 lambda 函数是相同的:它们都返回相同的变量,d。那么为什么他们会有不同的行为呢?
猜你喜欢
  • 1970-01-01
  • 2020-10-17
  • 2020-02-13
  • 2019-10-05
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
相关资源
最近更新 更多