先来看一组代码:
import copy
def f1(aa):
aa.append(1)
aa[1][0] = -1
a = [1, [100]]
b = []
b.append(a)
c = copy.copy(a)
d = copy.deepcopy(a)
f1(a)
print('a:{}\n b:{}\n c:{}\n d:{}'.format(a, b, c, d))
运行结果如下:
a:[1, [-1], 1]
b:[[1, [-1], 1]]
c:[1, [-1]]
d:[1, [100]]
- 首先明确,当把
list
作为参数传递至函数内时,相当于C++中传递数组,改变函数内list
的值,那么函数外的值也会相应改变,如上面的a
- 其次,通过
'='
或append()
方法的赋值,相当于将两个变量进行了绑定,因此在函数内对a
进行了修改,则函数外通过append()
的方式初始化的变量b
也相应改变
那么,该如何更安全地进行list
间的拷贝呢?这里又涉及两种拷贝:浅拷贝与深拷贝
两种拷贝都需要import copy
- 浅拷贝用法为
copy.copy(x)
, 相当于,若后续操作只修改了被拷贝list
的第一层,那么并不会影响拷贝的对象,但若修改更高层,则将会同步修改,如上面的c
,a
中的1和[100] (整体) 都是第一层,而100属于第二层,因此修改第二层的数字时,c
也相应改变 - 深拷贝则是
copy.deepcopy(x)
,如上面的d
,这时两者相互独立,无论如何修改a
, 都不会影响到d
,是最安全的