浅copy和深copy的使用方法
一、浅copy
先看代码:
names=['zhongxiantao','tanghaolun','wanglei','dafei','yanhuixiong'] names2=names.copy() print(names) print(names2)
['zhongxiantao', 'tanghaolun', 'wanglei', 'dafei', 'yanhuixiong'] ['zhongxiantao', 'tanghaolun', 'wanglei', 'dafei', 'yanhuixiong']
由上面代码可见,在使用copy功能是,names2能够完全复制names的列表数据。但是如果names列表数据发生以下变更,它还能复制吗?
names=['zhongxiantao','tanghaolun',[1,2,3],'wanglei','dafei','yanhuixiong'] names2=names.copy() print(names) print(names2)
['zhongxiantao', 'tanghaolun', [1, 2, 3], 'wanglei', 'dafei', 'yanhuixiong'] ['zhongxiantao', 'tanghaolun', [1, 2, 3], 'wanglei', 'dafei', 'yanhuixiong']
制这次,我们在列表中加入了一个列表,names2在复制时,依然全部复制了过去。我们来修改一点数据,将tanghanglun 修改为xiaoyu
names=['zhongxiantao','tanghaolun',[1,2,3],'wanglei','dafei','yanhuixiong'] names2=names.copy() print(names) print(names2) names[1]='xiaoyu' print(names) print(names2)
['zhongxiantao', 'tanghaolun', [1, 2, 3], 'wanglei', 'dafei', 'yanhuixiong'] ['zhongxiantao', 'tanghaolun', [1, 2, 3], 'wanglei', 'dafei', 'yanhuixiong'] ['zhongxiantao', 'xiaoyu', [1, 2, 3], 'wanglei', 'dafei', 'yanhuixiong'] ['zhongxiantao', 'tanghaolun', [1, 2, 3], 'wanglei', 'dafei', 'yanhuixiong']
第二次时,names2中的tanghaolun并没有随着names修改。
再改一点数据
names=['zhongxiantao','tanghaolun',[1,2,3],'wanglei','dafei','yanhuixiong'] names2=names.copy() print(names) print(names2) names[0]='xiaoyu' names[2][1]=4 print(names) print(names2)
['zhongxiantao', 'tanghaolun', [1, 2, 3], 'wanglei', 'dafei', 'yanhuixiong'] ['zhongxiantao', 'tanghaolun', [1, 2, 3], 'wanglei', 'dafei', 'yanhuixiong'] ['xiaoyu', 'tanghaolun', [1, 4, 3], 'wanglei', 'dafei', 'yanhuixiong'] ['zhongxiantao', 'tanghaolun', [1, 4, 3], 'wanglei', 'dafei', 'yanhuixiong']
大家发现没,我们将names的第一个数据改为xiaoyu,names2也跟着改了。
但是我们将names中的列表数据2改为4,names2却没有跟着修改。为什么呢?
因为。copy方法就是浅copy。什么叫浅copy,就是只复制第一层,在names2对names进行copy时,列表[1,2,3]对names2而言就是第一层就是一个内存地址,第二层才是里面的数据,但是浅copy不会进行第二层,所以不会改变。如果要让names2跟着names进行改变,则需要深copy
等等我们先总结浅copy的几种代码形式:
import copy names=['zhongxiantao','tanghaolun',[1,2,3],'wanglei','dafei','yanhuixiong'] names2=names.copy() names2=copy.copy(names) names2=names[:] names2=list(names)
二、深copy
import copy names=['zhongxiantao','tanghaolun',[1,2,3],'wanglei','dafei','yanhuixiong'] names2=copy.deepcopy(names) print(names) print(names2) names[0]='xiaoyu' names[2][1]=4 print(names) print(names2)
['zhongxiantao', 'tanghaolun', [1, 2, 3], 'wanglei', 'dafei', 'yanhuixiong'] ['zhongxiantao', 'tanghaolun', [1, 2, 3], 'wanglei', 'dafei', 'yanhuixiong'] ['xiaoyu', 'tanghaolun', [1, 4, 3], 'wanglei', 'dafei', 'yanhuixiong'] ['zhongxiantao', 'tanghaolun', [1, 2, 3], 'wanglei', 'dafei', 'yanhuixiong']
要进行深copy,我们需要导入内置的copy模块。
使用了deepcopy后,列表中的数据全部都复制过来了。又有朋友要问了,那为什么names里的xiaoyu改了,第四条结果没有改,我们看看逻辑。xiaoyu是在执行完两个print后改的,也就是在执行外copy功能后改的,names2当然不会更改。但是列表数据不一样,刚刚说了,列表中的列表,copy到的只是内存地址,显示时根据内存地址去取,所以再去去时就能读取到已经改掉的地方。