解决方法:Python 中的可变默认参数

Workaround Mutable Default Arguments in Python

提问人:Kraken 提问时间:4/9/2023 最后编辑:TomerikooKraken 更新时间:4/9/2023 访问量:102

问:

通过python文档,我在下面遇到了。

重要警告:默认值仅计算一次。这 当默认值是可变对象(例如 大多数类的列表、字典或实例。例如, 以下函数累积传递给它的参数 后续调用:

def f(a, L=[]):
    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))

这将打印

[1]
[1, 2]
[1, 2, 3]

如果不希望在后续调用之间共享默认值,可以改为编写如下函数:

def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L

现在,据我了解,第一个示例的行为方式与它一样,因为在定义中绑定到一个空列表,因此对它的任何更改(在多个调用中)都将反映在原始列表中。L

因此,在第二个示例中,我们不绑定到任何内容(即 ),因此在多次调用时,我们始终将其设置为 。 所以我的问题是,为什么我们甚至在第二个例子中需要 if 语句,它不会总是正确的吗?LNoneNoneif L is None

python 默认参数

评论


答:

1赞 Lecdi 4/9/2023 #1

不,这并不总是正确的。 是 的默认参数,但并不总是 。该函数允许调用方输入自己的列表。如果删除了 ,则始终被空列表替换,即使调用方尝试将不同的列表传递给函数也是如此。NoneLNoneifL