Python 可变参数(mutable variable)默认参数陷阱及讨论
现象
阅读《Intermediate python》时,遇到一个之前忽略的问题:使用mutable variable作为函数的默认参数,下面是example:
def add_to(v, target=[]):
target.append(v)
return target
add_to(1)
add_to(2)
r = add_to(3)
print(r) # [1, 2, 3]
在上面这个例子中,调用add_to()函数多次,将把1、2、3的结果添加到target中,熟悉其他编程语言的同学可能会同样觉得这与预期结果不符。
为什么会这样?
先简单说明一下为什么会出现这种结果:在python中函数的默认参数在定义时确定,而不是每次调用时初始化值,如果不显示的对默认参数赋值,那么使用的是在编译时确定的对象。下面是Python Common Gotchas中摘录的原因解释:
Python’s default arguments are evaluated once when the function is
defined, not each time the function is called (like it is in say,
Ruby). This means that if you use a mutable default argument and
mutate it, you will and have mutated that object for all future calls
to the