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/

10-11 18:11