python的深浅拷贝

时间:2022-09-04 19:49:32

测试环境:python 2.7

需要使用到模块 copy.py

 

该模块内有两个方法

copy.copy()  #浅拷贝

copy.deepcopy()  #深拷贝

浅拷贝与深拷贝的区别:

浅拷贝只能拷贝第一层的内容

深拷贝可以拷贝从外到内n层的内容

 

请看例子:

list1 = [1,2,3,4]
list2 = list1
list1.append(99)
print list2

打印结果:list2 = [1,2,3,4,99]

说明:在python中,对变量进行引用类型的赋值时,相当于把地址赋值给了变量

对引用类型的介绍:http://www.cnblogs.com/gametesting/p/7159398.html

为了解决这个问题,我们可以使用切片操作:

list2 = list1[:]

同时,我们也可以引入浅拷贝的概念,只拷贝值

 

list1 = [1,2,3,4]
list2 = copy.copy(list1)
list1.append(99)
print list2

打印结果:list2 = [1,2,3,4]

修改list1的时候,并没有对list2进行修改

我们也可以在copy.copy()完成后,借助于id(list1),id(list2)对比,可以发现二者的内存地址并不相同,使用浅拷贝相当于把list1的值拷贝到一块新的内存区域,然后赋值给list2

 

但是,当list1 = [1,2,3,4,[1,2]] (操作对象超过一维的时候)时

我们使用浅拷贝,就没用了

(代码省略),使用浅拷贝后,发现,修改list1的值,还是会修改list2的值

 

这时候,我们就需要用到深拷贝copy.deepcopy()

list1 = [1,2,3,4,[1,2]]
list2 = copy.deepcopy(list1)
list1[4].append(99)
print list2

 打印结果,完美解决问题