lambda函数和Python中的函数列表

时间:2013-05-26 20:39:27

标签: python lambda

我有一系列函数,例如:

>>> 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]是相同的?

2 个答案:

答案 0 :(得分:10)

那是因为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?

答案 1 :(得分:3)

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

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

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