我有一系列函数,例如:
>>> 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]是相同的?
答案 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
答案 1 :(得分:3)
在Python中,闭包不捕获实际值,而是捕获名称空间。因此,当您在函数中使用i
时,它实际上会在封闭范围中查找。那里的价值已经发生了变化。
您不需要所有这些lambda
和列表来查看此内容。
>>> x = 1
>>> def f():
... print(x)
...
>>> x = 2
>>> def g():
... print(x)
...
>>> g()
2
>>> f()
2