Python 通过列表定义多个函数时的奇怪行为

Python 通过列表定义多个函数时的奇怪行为,python,loops,user-defined-functions,Python,Loops,User Defined Functions,可能重复: 使用此代码: 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:

可能重复:

使用此代码:

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不同:可能是因为Python在计算PHI(1,1)时使用了最后一个“u”,即2


但是我想声明一个函数列表,它是按照PHI_list_0的定义方式定义的,具有列表理解功能。有人知道我是怎么做到的吗

定义函数时,它会在函数体中的自由变量上创建闭包。在PHI_列表中,这是变量
u
。它不保留u的值,而是保留对名称u的引用。调用函数时,它使用当前值u。所以所有函数都引用同一个变量,并且都看到它的相同(最后一个)值,所以它们的行为都是相同的

您可以使用默认值技巧解决此问题:

PHI_LIST_0 = [lambda a, b, u=u: a+b+u for u in xrange(3)]

现在,u参数的默认值是在定义函数时计算出来的,并与函数一起存储。

这就是我的想法,但随后我使用
copy
获得
u
的值,但它仍然没有按预期工作。-但您的解决方案非常优雅,而且运行良好。:)谢谢!它工作得很好。