首页 > 其他 > 详细

copy-浅及深的复制操作

时间:2020-03-15 16:18:43      阅读:67      评论:0      收藏:0      [点我收藏+]

一、浅拷贝:copy.copy

copy对于一个复杂对象的子对象并不会完全复制,什么是复杂对象的子对象呢?就比如序列里的嵌套序列,字典里的嵌套序列等都是复杂对象的子对象。对于子对象,python会把它当作一个公共镜像存储起来,所有对他的复制都被当成一个引用,所以说当其中一个引用将镜像改变了之后另一个引用使用镜像的时候镜像已经被改变了。

1)元组形式:

import copy
a=[1,2,3]
b=[4,5,6]
c=(a,b)
e=copy.copy(c)
print(c[0])#[1, 2, 3]
print(e[0])#[1, 2, 3]
a.append(4)
print(c[0])#[1, 2, 3, 4]
print(e[0])#[1, 2, 3, 4]
print(id(c))#61398072
print(id(e))#61398072
print(c is e)#True

可以看到:e和c是指向了同一个地址

列表形式:

import copy
a=[1,2,3]
b=[4,5,6]
c=[a,b]
e=copy.copy(c)
print(c[0])#[1, 2, 3]
print(e[0])#[1, 2, 3]
a.append(4)
print(c[0])#[1, 2, 3, 4]
print(e[0])#[1, 2, 3, 4]
print(id(c))#51304688
print(id(e))#51304768
print(c is e)#False

可以看到:c和e指向了不同的地址,但是c和e里面的内容是指向了相同的地址

技术分享图片

 

2)深拷贝:

deepcopy的时候会将复杂对象的每一层复制一个单独的个体出来,deep copy 更加符合我们对「复制」的直觉定义: 一旦复制出来了,就应该是独立的了。如果我们想要的是一个字面意义的「copy」,那就直接用 deep_copy 即可

元组形式:

import copy
a=[1,2,3]
b=[4,5,6]
c=(a,b)
e=copy.deepcopy(c)
print(c[0])#[1, 2, 3]
print(e[0])#[1, 2, 3]
a.append(4)
print(c[0])#[1, 2, 3, 4]
print(e[0])#[1, 2, 3]
print(id(c))#61132032
print(id(e))#66655976
print(c is e)#False

列表形式:

import copy
a=[1,2,3]
b=[4,5,6]
c=[a,b]
e=copy.deepcopy(c)
print(c[0])#[1, 2, 3]
print(e[0])#[1, 2, 3]
a.append(4)
print(c[0])#[1, 2, 3, 4]
print(e[0])#[1, 2, 3]
print(id(c))#52553888
print(id(e))#52553968
print(c is e)#False

c和e指向了不同的地址,但是c和e里面的内容也指向了不相同的地址

技术分享图片

 

copy-浅及深的复制操作

原文:https://www.cnblogs.com/bashliuhe/p/12498133.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!