关于“可变数据类型”做函数默认参数的问题
若在函数中进行了修改则会有“坑”
如果我们在函数传参时用这个默认参数并且在函数的内部对可变数据类型数据进行了“修改”,那么这样做是有问题的:如果多次调用同一个函数,被当做参数的这个“可变数据类型”会一直用同一个:
def func(name,lst=[]): lst.append(name) print(lst,id(lst)) func(1) func(2) func(3) ''' 结果: [1] 1920462303368 [1, 2] 1920462303368 [1, 2, 3] 1920462303368 '''
由上面的结果可以看出:func函数被调用了三次,每一次的结果“迭代”了。
传参的时候指定具体的值是没有问题的
参看下面的代码:
def func(name,lst=[]): lst.append(name) print(lst,id(lst)) func(1,lst=[1]) func(2,lst=[2]) func(3,lst=[3]) ''' 结果: [1, 1] 2639469556104 [2, 2] 2639469556104 [3, 3] 2639469556104 '''
可以看到:这样每一次的结果不会“迭代了”;之所以id一样,是因为每一次调用结束后Python解释器将原来的lst回收掉,内存地址分配给了新的“列表”。