2

可能的重复:
Python 中的“Least Astonishment”:可变默认参数

我做了这个功能:

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。

4

1 回答 1

2

当您使用对象作为默认参数时,该对象的同一实例将用于对该函数的所有调用。这对于不可变对象来说很好,但对于可变对象来说却是一个问题。当函数可能期望有一个“新”对象时,同一个对象会被多次修改和重用。

您可以使用这样的解决方法来获得所需的功能:

def test(num,v=None):
    if v is None:
        v = []
    ....
于 2012-11-18T03:03:31.243 回答