<>深浅拷贝

首先,我们知道Python3中,有6个标准的数据类型,他们又分为可变和不可变。

不可变数据(3个):

* Number(数字)
* String(字符串)
* Tuple(元组)
可变数据(3个):

* List(列表)
* Dictionary(字典)
* Set(集合)
<>copy 模块里面的copy方法 (浅拷贝)
#1、对于 不可 变类型 Number String Tuple,浅复制仅仅是地址指向,不会开辟新空间。 #2、对于 可 变类型
List、Dictionary、Set,浅复制会开辟新的空间地址(仅仅是最顶层开辟了新的空间,里层的元素地址还是一样的),进行浅拷贝
#3、浅拷贝后,改变原始对象中为可变类型的元素的值,会同时影响拷贝对象的;改变原始对象中为不可变类型的元素的值,只有原始类型受影响。`(操作拷贝对象对原始对象的也是同理)
<>代码演示
import copy #不可变数据类型 #数值 num a=0 b=copy.copy(a) print(a is b) #True #is
内容和地址都相等 #字符串 str a='yyyy' b=copy.copy(a) print(a is b) #True #元组 tuple a=(1,2,3
,[1,2]) b=copy.copy(a) print(a is b) #True #可变数据类型 #集合 set a={1,2,3,4} b=copy.
copy(a) print(a is b) #False #字典 dict a={1:2,3:4} b=copy.copy(a) print(a is b)
#False #列表 list a=[1,2,3,4] b=copy.copy(a) print(a is b) #False #可变类型进行修改
#浅复制会开辟新的空间地址,仅仅是最顶层开辟了新的空间,里层的元素地址还是一样的,所以a[3]发生改变时,b也会 #跟着变化。 a=(1,2,3,[4,5,6]
) b=copy.copy(a) print(id(a)==id(b)) #True 修改之前 a[3].append(7) print(id(a)==id(b
)) #True 修改之后
<>copy模块里的deepcopy方法实现
#1、深拷贝,除了顶层拷贝,还对子元素也进行了拷贝(本质上递归浅拷贝) #2、经过深拷贝后,原始对象和拷贝对象所有的元素地址都没有相同的了
<>代码演示
import copy #不可变数据类型 #数值 num a=0 b=copy.deepcopy(a) print(a is b) #True #is
内容和地址都相等 #字符串 str a='yyyy' b=copy.deepcopy(a) print(a is b) #True #元组 tuple a=(1
,2,3,[1,2]) b=copy.deepcopy(a) print(a is b) #True #可变数据类型 #集合 set a={1,2,3,4} b
=copy.deepcopy(a) print(a is b) #False #字典 dict a={1:2,3:4} b=copy.deepcopy(a)
print(a is b) #False #列表 list a=[1,2,3,4] b=copy.deepcopy(a) print(a is b)
#False #可变类型进行修改 #深拷贝,除了顶层拷贝,还对子元素也进行了拷贝(本质上递归浅拷贝) a=(1,2,3,[4,5,6]) b=copy.
deepcopy(a) print(id(a)==id(b)) #False 修改之前,这里如里面列表改为不可变类型(字符串,元组),结果为True。 a[3]
.append(7) print(id(a)==id(b)) #False 修改之后
<>总结

​ 因为的深拷贝对比浅拷贝,强调的是 递归,强调的是资源素。对了顶层的操作,深浅拷贝无异。

所以说深拷贝与浅拷贝,最大的区别在于第二层及其之后的。

​ 对于浅拷贝来说,第二层无论是可变数据类型还是不可变数据类型,id地址都是相同的,所以a(可变类型)进行修改,b也会跟着进行修改。

​ 对于深拷贝来说,第二层无论是可变数据类型,id地址是相同的。但是为不可变数据类型时,id地址是不同的,所以a进行修改,b是不会修改的。

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信