深浅拷贝的区别

深浅拷贝

首先,我们知道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)
printid(a)==id(b)#False  修改之前,这里如里面列表改为不可变类型(字符串,元组),结果为True。
a[3].append(7)
print(id(a)==id(b)) #False   修改之后


总结

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

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

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

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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值