Python编程整理:函数中默认形参可能被调用函数更改
出现数据串流、错误更改的代码如下:
def func(a, b, list1=[]): list1.append(b) print(a, b, list1) func(1, 2) func(1, 3) func(1, 4) # 1 2 [2] # 1 3 [2, 3] # 1 4 [2, 3, 4]
我们会发现,三个func函数的调用都没有传入list1的实参。但是三次函数都没有初始化list1位空列表,而是直接把上次调用函数后的list1拿来用。
原因是,
***
默认形参只在函数定义阶段被赋值一次,拿到一个内存地址
***
因为,只有在函数定义阶段默认参数才被赋值一次,那么当这个默认值为可变变量,之后对这个可变变量的操作将会在同一地址上进行。由此,每一次调用函数都会更改这个参数的值,而达不到默认参数的作用。
解决方法如下:
def func(a, b, list1=None): if list1 is None: list1 = [] list1.append(b) print(a, b, list1) func(1, 2) func(1, 3) func(1, 4) # 1 2 [2] # 1 3 [3] # 1 4 [4]
建议函数默认参数尽量使用None或者不可变类型作为默认值。
浙公网安备 33010602011771号