可能重复:
“Least Astonishment” in Python: The Mutable Default Argument
这很奇怪,使用.append()方法时,Python中的可选列表参数在函数调用之间是持久的。
def wtf(some, thing, fields=[]):
print fields
if len(fields) == 0:
fields.append('hey');
print some, thing, fields
wtf('some', 'thing')
wtf('some', 'thing')
输出:
[]
some thing ['hey']
['hey'] # This should not happen unless the fields value was kept
some thing ['hey']
为什么“字段”列表在参数时包含“嘿”?我知道它是本地范围,因为我无法在函数外部访问它,但函数会记住它的值。
答案 0 :(得分:3)
默认值仅评估一次,因此使用可变类型作为默认值将产生意外结果。你最好做这样的事情:
def wtf(some, thing, fields = None):
if fields is None:
fields = []