0.摘要
我们将一个list传入函数后,函数内部对实参修改后,形参也会随之改变。本文将主要介绍这种错误的现象、原因和解决方法。
1.代码示例
def fun(inner_lst):
inner_lst.pop()
lst = [1,2,3,4,5,6,7]
fun(lst)
print(lst)
fun(lst)
print(lst)
fun(lst)
print(lst)
fun(lst)
print(lst)
fun(lst)
print(lst)
从运行结果上,可以看出,
虽然我们改变的是fun()内部的inner_lst,但是,外部的lst也随之改变了。
因此,如果我们将一个列表传入一个函数的,运行这个函数,可能会破坏我们的原始数据,这可能并不是我们想要看到的。
2.原因
首先,我们解释一下上面这种情况的原因。
在python中,数据有两种类型:mutable(可变) 和 immutable (不可变)
list ,dict是mutable的;
int , string , float ,tuple是inmutable 的。
在函数参数的传递过程中:
对于inmutable object ,函数参数传递是值
对于mutable object,函数参数传递是指针
因此,当我们把lst传入fun()函数时,实际是把lst的指针传递给了inner_lst变量。
所以,lst的值会随着inner_lst进行变化。
3.解决
如果我们传入函数的形参是一个list变量,那么我们需要先拷贝一份,之后的操作在备份上进行,这样便不会破坏原始数据。
比如:
def fun(inner_lst):
lst_copy = inner_lst.copy()
lst_copy.pop()
print("lst_copy = ",lst_copy)
lst = [1,2,3,4,5,6,7]
fun(lst)
print("lst = ",lst)