Possible Duplicate:
What do (lambda) function closures capture in Python?
使用此代码:
def problem():
PHI_LIST_0 = [lambda a, b: a+b+u for u in xrange(3)]
PHI_LIST_1 = [lambda a, b: a+b+0, lambda a, b: a+b+1, lambda a, b: a+b+2]
for phi in PHI_LIST_0: print "v0:", phi(1,1)
print
for phi in PHI_LIST_1: print "v1:", phi(1,1)
if __name__ == '__main__':
problem()
我得到:
v0: 4
v0: 4
v0: 4
v1: 2
v1: 3
v1: 4
预期的行为是最后一个行为,为PHI_LIST_1。我想我理解为什么结果与PHI_LIST_0不同:也许是因为在计算phi(1,1)时,Python使用了最后一个'u'(即2)。
但是我想用定义列表的方式声明定义PHI_LIST_0的函数列表。有人知道我该怎么做吗?
最佳答案
定义函数时,它会在函数主体中的自由变量上创建一个闭包。在您的PHI_LIST_0中,这是变量u
。它不保留u的值,而是保留对名称u的引用。调用该函数时,它使用u的当前值。因此,所有函数都引用相同的变量,并且所有变量都具有相同的(最后一个)值,因此它们的行为均相同。
您可以使用默认值技巧解决此问题:
PHI_LIST_0 = [lambda a, b, u=u: a+b+u for u in xrange(3)]
现在,在定义函数时将计算u参数的默认值,并将其与函数一起存储。
关于python - 通过列表理解定义多个功能时的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13823194/