我们在Python里写函数时,常常会给一些参数赋初始值。我们把这些初始值叫作Default Argument Values。
一般情况下,我们可以很自由的给参数赋初值,而不需要考虑任何异常的情况或者陷阱。
但是当你给这些参数赋值为可变对象(mutable object),比如list,dictionary,很多类的实例时,那么你要小心了,因为函数参数
的初值只能被计算一次(在函数定义的时间里)。
怎么来理解呢?我们来看下面的例子。
按我们常规的理解,上面的输出结果应该是[‘a’],[‘b’]和[‘c’],而不是[‘a’],[‘a’, ‘b’]和[‘a’, ‘b’, ‘c’]。难道解释器
有问题?答案是解释器的输出结果完全正确。由于前面我们说了函数参数的初值只会在函数定义的时间里计
算一次。所以,你在第二次调用函数时,my_list=[]不会再被执行,此时my_list已经不在等于[],而是等于
[‘a’],以此类推。
为了看清本质,我们将上面的代码改一下,在操作my_list之前,我们先输出my_list。代码如下:
既然会出现这样的小陷阱,那么我们怎么来避免呢?下面的代码将消除这个小陷阱。
当然,我们也可以给my_list赋可变对象,然后将my_list在使用之前初始化。代码如下:
参考
[1] http://blog.chinaunix.net/uid-15174104-id-3616169.html