Python随记(四)列表复制 之 直接赋值 浅拷贝 和 深度拷贝的分析
我的平台:Uabantu16.04+python3.6
1.三者简述
a. 直接赋值: 用等号 = ,其实就是对象的引用
b.浅拷贝: 用copy( ),拷贝父对象,但是不会拷贝内部子对象
c.深度拷贝: 用deepcopy,是采用的模块copy中的deepcopy方法,完全拷贝父对象和子对象
2.程序举例
现创建一个列表a,列表里的子对象也是列表,并进行赋值,浅拷贝,和 深度拷贝操作:
如图所示,
b是赋值所得,
c是浅拷贝所得,
d是深度拷贝所得,注意在使用深度拷贝之前,先要调用copy模块: import copy
此时可以看到四者的值一样
2.1直接赋值和拷贝(浅或深)之间的区别
在列表a后面添加一个新的元素【0,0,0】:
可以看到,我只改变了列表a,但是b也跟着变化了,c 和 d却没有变化
说明:赋值操作其实不是真的拷贝,它只是令变量b指向了a所指向的对象,他们两个其实共同指向一个对象,类似于C++中的引用!
改变其中一个,另一个会接着改变。
而拷贝操作,无论深浅,都是相当于新建了一个新的列表,这个列表c 和 d 与源列表 a其实是独立的,所以列表c和d并无变化!
2.2浅拷贝和深度拷贝的区别
现在对列表a的子对象进行操作!比如令其第一个列表增加一个数字9,如图:
会发现,a变化是ok的,因为我们本身就在对a进行操作,b变化也是ok的,因为2.1说了它俩其实指向一个对象
但是c居然也变化了,这就是所谓浅拷贝 浅 在何处了,父对象和a指向的对象是独立的,而子对象,比如这个列表元素[1, 2, 3]其实和a里面的子对象还是指向同一个对象!
所以浅拷贝不能说是创建了一个完全独立的新的列表,而深度拷贝,可以看出,真的就是生成了一个完全不相关的新的列表d!不管a怎么变,d列表我自岿然不动
三者区别想必大家已经清楚了