可能重复:
“Least Astonishment” in Python: The Mutable Default Argument
def f(a, L=[]):
L.append(a)
return L
print(f(1, [1, 2]))
print(f(1))
print(f(2))
print(f(3))
我想知道为什么其他f(1),f(2),f(3)没有附加到第一个f(1,[1,2])。 我想结果应该是:
[1, 2, 1]
[1, 2, 1, 1]
[1, 2, 1, 1, 2]
[1, 2, 1, 1, 2, 3]
但结果不是这个。我不知道为什么。
答案 0 :(得分:6)
将两个不同的问题(更好地称为概念)融合到一个问题陈述中。
第一个问题与agh指出的SO问题有关。该线程给出了一个详细的解释,除了为了这个线程之外再次解释它没有任何意义我可以采取特权说明函数是第一类对象,并且参数及其默认值在声明期间是有界限的。因此,这些参数的作用与函数的静态参数非常相似(如果在不支持First Class Function Objects的其他语言中可以实现某些功能。
第二个问题是参数L
绑定的List Object。传递参数时,传递的List参数是L绑定的参数。在没有任何参数的情况下调用时,更像是使用不同的列表(作为默认参数提到的列表)进行绑定,其中偏离与第一次调用中传递的不同。为了使案例更加突出,只需按照以下方式更改您的功能并运行示例。
>>> def f(a, L=[]):
L.append(a)
print id(L)
return L
>>> print(f(1, [1, 2]))
56512064
[1, 2, 1]
>>> print(f(1))
51251080
[1]
>>> print(f(2))
51251080
[1, 2]
>>> print(f(3))
51251080
[1, 2, 3]
>>>
如您所见,第一个调用打印参数L
的不同ID,与后续调用形成对比。因此,如果列表不同,那么行为以及值的附加位置。希望现在它应该有意义
答案 1 :(得分:0)
如果你没有传递第二个参数,如果你调用函数初始化空列表,为什么你等待结果呢?
对于那些你想要的结果,你应该使用闭包或全局变量。