0

可能的重复:
Python 中的“Least Astonishment”:可变默认参数

下面的代码说明了这个问题:

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'}

我希望第一个、第二个循环的输出和随后的 2 个单调用(其参数与 for 循环的值匹配)将具有相同的文本输出,但fn保留named_paramif 未明确默认为空字典的值。文档中是否定义了功能?

4

1 回答 1

1

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

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

于 2012-10-24T18:23:44.280 回答