2

我有一系列函数,例如:

>>> 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] 是一样的?

4

2 回答 2

10

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

>>> 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

必读: (lambda)函数闭包捕获什么?

于 2013-05-26T20:44:24.583 回答
3

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

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

>>> x = 1
>>> def f():
...   print(x)
...
>>> x = 2
>>> def g():
...   print(x)
...
>>> g()
2
>>> f()
2
于 2013-05-26T20:59:17.873 回答