可能重复:
“Least Astonishment” in Python: The Mutable Default Argument
以下代码说明了问题:
def fn(param, named_param={}, another_named_param=1):
named_param[param] = str(another_named_param)
another_named_param += param
return named_param
for i in range(0, 2):
result = {}
result = fn(i)
print result
print
for i in range(0, 2):
result = fn(i, named_param={})
print result
print
result = fn(0)
print result
result = fn(1)
print result
输出:
{0: '1'}
{0: '1', 1: '1'}
{0: '1'}
{1: '1'}
{0: '1', 1: '1'}
{0: '1', 1: '1'}
我预计第一个,第二个循环和后续两个单一调用的输出与param匹配for循环的值将具有相同的文本输出,但fn
保持named_param
的值如果没有明确默认为空字典。是否在文档中定义了功能?
答案 0 :(得分:1)
执行函数定义时,将named_param
的默认值计算一次。它每次都是相同的字典,并且在调用函数之间保留其值。
除非你不改变它们,否则不要在函数中使用可变对象作为默认值。相反,使用None
或其他sentinel值,并检查该值并将其替换为新对象(例如空字典)。这样每次调用函数时都会得到一个新的。