示例1:可变对象作为默认值参数
def demo(newitem, old_list=[]):
old_list.append(newitem)
return old_list
print(demo('5', [1, 2, 3, 4]))
print(demo('aaa', ['a', 'b']))
print(demo('a'))
print(demo('b'))
[1, 2, 3, 4, '5']
['a', 'b', 'aaa']
['a']
['a', 'b']
示例2:不可变对象作为默认值参数
def demo(newitem, old_list=None):
if old_list == None:
old_list = []
old_list.append(newitem)
return old_list
print(demo('5', [1, 2, 3, 4]))
print(demo('aaa', ['a', 'b']))
print(demo('a'))
print(demo('b'))
[1, 2, 3, 4, '5']
['a', 'b', 'aaa']
['a']
['b']
原因分析:
1.多次调用带有默认值参数的函数,参数默认值只会在第一次调用时进行初始化。因此如果参数默认值为变量,则默认参数就是函数初始化时变量所指的对象。
2.函数形参中默认值为容器类对象时,多次调用可能会发生累加效应,所以形参中一般不建议使用容器类对象做默认值,建议使用None做默认值。
3.基于此,我们应该避免使用可变对象作为参数默认值,这是因为假如使用可变对象作为参数默认值,且没有进行显性传参,那么该对象会被多次默认调用的函数参数共享,如果函数内部又存在原地修改对象的操作,便会影响到其他调用的函数,导致不同调用的内部默认参数不再独立,会互相影响,从而容易出现严重的错误。
一句话总结:避免使用可变对象作为参数默认值(切记!切记!切记!)
可变对象:列表、字典、集合
不可变对象:元组、字符串、int、float、bool…