以该函数为例:
def add_end(L=[]):
L.append('END')
return L
当你正常调用时,结果似乎不错:
>>> add_end([1, 2, 3])
[1, 2, 3, 'END']
>>> add_end(['x', 'y', 'z'])
['x', 'y', 'z', 'END']
当你使用默认参数调用时,一开始结果也是对的:
>>> add_end()
['END']
但是,再次调用add_end()
时,结果就不对了:
>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']
原因为:
解释器在遇到def语句时就会对函数的默认参数自动构造对象,而且只构造这么一次,所以多次调用add_end()函数没有给默认参数传值时,在函数内部实际使用的对象都是同一个。函数也是对象,函数的默认参数也是对象,默认参数在函数定义时构造一次,且只构造一次。
定义默认参数要牢记一点:默认参数必须指向不变对象!