当参数具有默认值时,Python递归函数结果取决于先前的调用

标签 python

Possible Duplicate:
“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。

最佳答案

当您使用对象作为默认参数时,该对象的同一实例将用于对该函数的所有调用。这对于不可变对象(immutable对象)来说效果很好,但对于可变对象来说就成了问题。当函数可能期望有一个"new"对象时,同一对象会被多次修改和重用。

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

def test(num,v=None):
    if v is None:
        v = []
    ....

关于当参数具有默认值时,Python递归函数结果取决于先前的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13437063/

相关文章:

python - 将列表拆分为总和大致相等的 N 个子列表

python - 分解多行中具有密集向量的列

c++ - 如何向自己发出信号(相同的 PID)?

python - 高级描述 Pandas

python - E0401 :Unable to import 'flask'

python - 防止Python脚本中的写入中断

python - 使用 openCV 进行相机校准 - cv2.getOptimalNewCameraMatrix 导致 roi 为零

python - DJANGO - 使用 REST 框架在 POST 方法上使用 genericforeignkey 保存数据

python - 根据逗号获取数组列中元素的数量,并将该计数转换为自己的列

python - 如何将 httpie 与 httpie-aws-authv4 捆绑到 Python zipapp 中?