可能重复:
“Least Astonishment” in Python: The Mutable Default Argument
我做了这个功能:
def test(num,v=[]):
v.append(num)
if num == 10:
return v
return test(num+1,v)
当我使用它时,之前调用的结果似乎仍然存在:
>>> test(3)
[3, 4, 5, 6, 7, 8, 9, 10]
>>> test(3)
[3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 5, 6, 7, 8, 9, 10]
>>> test(3)
[3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 5, 6, 7, 8, 9, 10, 3, 4, 5, 6, 7, 8, 9, 10]
如果我在函数声明中仅使用v
而不是v=[]
,它似乎有效。
我错过了什么?我希望每次运行它时功能都是新鲜的。我使用的是Python 2.7.3。
答案 0 :(得分:2)
当您使用对象作为默认参数时,对象的同一实例将用于对该函数的所有调用。这适用于不可变对象,但对于可变对象而言则成为问题。当函数可能期望具有“新”对象时,同一对象被修改并重复使用多次。
您可以使用这样的解决方法来获得所需的功能:
def test(num,v=None):
if v is None:
v = []
....