浅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到的只是内存地址,显示时根据内存地址去取,所以再去去时就能读取到已经改掉的地方。

posted @ 2018-01-17 14:54  颜不胖  阅读(227)  评论(0编辑  收藏  举报