Python禁制函数修改可变参数

mac2024-06-28  54

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的方式,通过参数拷贝,保证原始对象不会被函数修改。

最新回复(0)