观察如下代码:
def func(a, b=[]):
b.append(a)
return b
l1 = func(1) # 期待 b = [1]
l2 = func(2) # 期待 b = [2]
l3 = func(3, [1, 2]) # 期待 b = [1, 2, 3]
l4 = func(4, [1, 2]) # 期待 b = [1, 2, 4]
l5 = func(5) # 期待 b = [5]
print('l1', l1) # [1, 2, 5]
print('l2', l2) # [1, 2, 5]
print('l3', l3) # [1, 2, 3]
print('l4', l4) # [1, 2, 4]
print('l5', l5) # [1, 2, 5]
实际输出:
函数的第二个默认参数是一个list,当第一次执行的时候实例化了一个list,如果后续使用仍使用默认的list,则还是会使用第一次执行的时候实例化的地址存储,所以第一次,第二次和第五次执行的结果是相同的。
因此,如果要使用这种可变数据类型作为默认参数,那么默认参数在函数中最好能够只读不写,那默认值就不会被修改,可变类型做默认参数就不会出现问题。