【问题标题】:lambda functions and list of functions in PythonPython中的lambda函数和函数列表
【发布时间】:2013-05-27 04:59:17
【问题描述】:

我有一个函数数组,例如:

>>> def f():
...     print "f"
... 
>>> def g():
...     print "g"
... 
>>> c=[f,g]

然后我尝试创建两个 lambda 函数:

>>> i=0
>>> x=lambda: c[i]()
>>> i+=1
>>> y=lambda: c[i]()

然后,给他们打电话:

>>> x()
g
>>> y()
g

为什么 lambda 中的 c[i] 是一样的?

【问题讨论】:

  • 解决这个问题的简单方法是首先不要创建无用的lambdas。只需将这两行替换为x = c[i] 和y = c[i],您将获得您想要的功能。写lambda: f() 而不是f 的唯一原因是将f 粘贴到闭包命名空间中以便以后查找,而不是仅仅使用它。您不想在这里这样做,事实上这正是导致您的问题的原因。

标签: python lambda


【解决方案1】:

这是因为 lambda 函数在运行时获取全局变量 i 的值:

>>> i = 0
>>> x=lambda z = i : c[z]() #assign the current value of `i` to a local variable inside lambda
>>> i+=1
>>> y =lambda z = i : c[z]()
>>> x()
f
>>> y()
g

必读: What do (lambda) function closures capture?

【讨论】:

【解决方案2】:

在 Python 中,闭包不捕获实际值,而是捕获命名空间。因此,当您在函数中使用 i 时,它实际上是在封闭范围内查找的。而且那里的价值已经改变了。

您不需要所有这些lambdas 和列表来查看此内容。

>>> x = 1
>>> def f():
...   print(x)
...
>>> x = 2
>>> def g():
...   print(x)
...
>>> g()
2
>>> f()
2

【讨论】:

    猜你喜欢
    • 2022-11-24
    • 2016-04-10
    • 1970-01-01
    • 2020-02-09
    • 2020-04-27
    • 2022-11-14
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多