为什么这个带有名为参数的字典和默认值的python函数在每次调用时都不应用默认值?

时间:2012-10-24 18:19:33

标签: python

  

可能重复:
  “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的值如果没有明确默认为空字典。是否在文档中定义了功能?

1 个答案:

答案 0 :(得分:1)

执行函数定义时,将named_param的默认值计算一次。它每次都是相同的字典,并且在调用函数之间保留其值。

除非你不改变它们,否则不要在函数中使用可变对象作为默认值。相反,使用None或其他sentinel值,并检查该值并将其替换为新对象(例如空字典)。这样每次调用函数时都会得到一个新的。