Python 禁制函数修改可变参数
上次的分享已经说明了:函数参数传递分为可变类型参数和不可变类型参数
可变类型参数,传送的是对象的引用,或者说是实参的地址不可变类型参数,传递的是对象的副本,或者说是实参的拷贝举例1:
num_s = 10 def num_function(num_x): num_x =+ 10 print(num_s) num_function(num_s) print(num_s)运行结果:
10 10因为数字是不可变类型参数,所以调用num_function(num_s)过程,实参num_s是10,传递给形参num_x的是它的副本,所以函数内部修改参数的值,并不改变函数外的实参。
举例2
list_s = [1,2,3,4] def add_list(list_x): list_x.append(7) print(list_s) add_list(list_s) print(list_s)运行结果
[1, 2, 3, 4] [1, 2, 3, 4, 7]liist_s是列表属于可变类型参数,所以调用add_list(list_s)传递的是实参的引用,更好一点理解就是:实参list_s存放的是对象[1,2,3,4]的地址,经过函数调用给对象[1,2,3,4]起了另外一个别名叫list_x,它也存放[1,2,3,4]的地址,所以函数内通过append修改list_x,就是修改原实参指向的对象。
那么,如何做到可变类型参数不会在函数(函数辉修改参数)调用后改变呢?
以列表为例: 方法1:使用 list[:]作为实参
list_s = [1,2,3,4] def add_list(list_x): list_x.append(7) print(list_s) add_list(list_s[:]) print(list_s)运行结果
[1, 2, 3, 4] [1, 2, 3, 4]方法二:使用list的拷贝
list_s = [1,2,3,4] def add_list(list_x): list_x.append(7) print(list_s) add_list(list_s.copy()) print(list_s)运行结果
[1, 2, 3, 4] [1, 2, 3, 4]对于字典和集合也可使使用copy的方式,通过参数拷贝,保证原始对象不会被函数修改。