关于python:奇怪的默认参数行为

Weird default argument behavior

本问题已经有最佳答案,请猛点这里访问。

我有一个函数,add_hi,它将'hi,'预先添加到一个列表中:

1
def add_hi(ls=[]): ls.insert(0, 'hi,')

这适用于普通列表,但是如果我在没有任何参数的情况下调用函数两次,我会得到['hi,', 'hi,']。发生什么事?


这是一个常见的python错误(参见常见错误1)。函数参数的默认值在定义函数时只计算一次。因此,函数将停止在定义后将空列表作为默认参数。

上面链接的网站建议这样的函数结构来处理错误:

1
2
3
4
5
>>> def foo(bar=None):
...    if bar is None:      # or if not bar:
...        bar = []
...    bar.append("baz")
...    return bar