数据类型(二)、copy模块
创始人
2024-03-26 06:30:55
0

首先深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样,也就是地址的复制还是值的复制的区别。

什么是可变对象,什么是不可变对象:

可变对象是指,一个对象在不改变其所指向的地址的前提下,可以修改其所指向的地址中的值;

不可变对象是指,一个对象所指向的地址上值是不能修改的,如果你修改了这个对象的值,那么它指向的地址就改变了,相当于你把这个对象指向的值复制出来一份,然后做了修改后存到另一个地址上了,但是可变对象就不会做这样的动作,而是直接在对象所指的地址上把值给改变了,而这个对象依然指向这个地址。

深拷贝和浅拷贝需要注意的地方就是可变对象的拷贝:

在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的,但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别。

copy

copy.copy(x)

返回一个浅拷贝。

deepcopy

copy.deepcopy(x)

返回一个深拷贝。

拷贝详解

  • 拷贝操作直接影响到程序能否正确按照设计思路运行
  • 不正确的拷贝往往不报错,而这也是很多bug的原因

这里直接提供一个直观的例子:

import copy
a = [1,2,3,4,['a','b']]b = a                   # 赋值
c = a[:]                # 浅拷贝
d = copy.copy(a)        # 浅拷贝
e = copy.deepcopy(a)    # 深拷贝a.append(5)
a[4].append('c')print('a=',a)
print('b=',b)
print('c=',c)
print('d=',d)
print('e=',e)Output:
------------------------------
a= [1, 2, 3, 4, ['a', 'b', 'c'], 5]
b= [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c= [1, 2, 3, 4, ['a', 'b', 'c']]
d= [1, 2, 3, 4, ['a', 'b', 'c']]
e= [1, 2, 3, 4, ['a', 'b']]
------------------------------
  • Python中的直接赋值也只是传递对象
  • 对于copy操作来说,拷贝只进行了一层,之后的引用关系依然保留
  • 最彻底的拷贝操作是deepcopy.其功能与名字一样,会递归深入你的对象,将其里里外外每个层次都拷贝一份
class deepdark():def __init__(self):self.fantasy=list()self.fantasy.append('oh')def banana(self):print(self.fantasy)def boyNextDoor(self):self.fantasy.append('my shoulder')import copy
a = deepdark()
b = [1,a]
c = copy.copy(b)
d = copy.deepcopy(b)a.boyNextDoor()
a.banana()
b[1].banana()
c[1].banana()
d[1].banana()Output:
----------------------
['oh', 'my shoulder']
['oh', 'my shoulder']
['oh', 'my shoulder']
['oh']
---------------------
  • 这里可以很容易发现,deepcopy对于类的拷贝是直接生成一个值相同的新对象
>>> e=copy.copy(a)
>>> a.boyNextDoor()
>>> a.banana()
['oh', 'my shoulder', 'my shoulder']
>>> e.banana()
['oh', 'my shoulder', 'my shoulder']>>> e.boyNextDoor()
>>> e.banana()
['oh', 'my shoulder', 'my shoulder', 'my shoulder']
>>> a.banana()
['oh', 'my shoulder', 'my shoulder', 'my shoulder']>>> f=copy.deepcopy(a)
>>> a.boyNextDoor()
>>> a.banana()
['oh', 'my shoulder', 'my shoulder', 'my shoulder', 'my shoulder']
>>> f.banana()
['oh', 'my shoulder', 'my shoulder', 'my shoulder']
  • 所以,对于一个类的话,copy只是生成一个引用,而deepcopy才是进行复制

相关内容

热门资讯

黑龙江哈尔滨建立住宅物业管理联... 为全面提升住宅小区精细化管理水平,黑龙江省哈尔滨市印发《哈尔滨市住宅物业管理联席会议制度》,通过构建...
长沙市自动驾驶汽车发展条例 长沙市人民代表大会常务委员会公告 (2025年第16号) 《长沙市自动驾驶汽车发展条例》已经2025...
一次性信用修复政策哪些情况能享... 12月22日,中国人民银行发布《关于实施一次性信用修复政策有关安排的通知》,明确央行征信系统(金融信...
苹果与麦斯莫专利纠纷:法官驳回... 【苹果与麦斯莫血氧监测专利纠纷有新进展,苹果可继续美售更新款智能手表】12月27日消息,美国苹果公司...
河南省举行《河南省优化营商环境... 原标题: 我省举行《河南省优化营商环境条例》新闻发布会 以法治护航民营经济高质量发展(新闻发布厅) ...
六“字”解码《河南省优化营商环... 市场壁垒如何破除? 关键堵点怎样打通? 企业权益如何保障? 中小企业怎样融资? 如何做到无事不扰? ...
中国经济“四稳”政策:激活内生... 【12月28日消息,“四稳”政策助力稳增长】自2025年4月25日中央政治局会议首提“着力稳就业、稳...
这里既有产业基础又有政策支持 应聘者正在有序入场。 招聘单位和应聘者进行供需对接。 香港理工大学珠三角校友会为校友提供信息咨询...
关于《长沙市自动驾驶汽车发展条... 记者:请问《条例》的颁布,对于长沙自动驾驶汽车产业发展将有何助力作用? 市工业和信息化局党组成员、副...
构成犯罪!吉林省9人终生禁驾! 为有效震慑严重交通违法行为,不断提升驾驶人安全驾驶意识,切实提高遵守交通法律法规的自觉性,日前,吉林...