《Python编程基础》课件-6.6.2深浅拷贝的区别与实现_第1页
《Python编程基础》课件-6.6.2深浅拷贝的区别与实现_第2页
《Python编程基础》课件-6.6.2深浅拷贝的区别与实现_第3页
《Python编程基础》课件-6.6.2深浅拷贝的区别与实现_第4页
《Python编程基础》课件-6.6.2深浅拷贝的区别与实现_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

深浅拷贝的区别与实现教学目标1.掌握浅拷贝的实现方式

2.了解浅拷贝的局限性

3.了解什么是深拷贝

4.了解深浅拷贝的区别

浅拷贝(ShallowCopy)是Python中复制对象的一种方式,它创建新对象,但内部嵌套的可变对象(如列表内列表)仍共享引用。核心概念:浅拷贝只复制顶层对象,子对象保持原引用。这意味着修改拷贝的嵌套对象会影响原对象。优势:高效,内存开销小。1、什么是浅拷贝?

#浅拷贝基本示例importcopy#导入copy模块,用于拷贝操作original=[1,2,[3,4]]#原列表,包含嵌套列表shallow=copy.copy(original)#浅拷贝,创建新列表,但嵌套共享shallow[2][0]=5#修改拷贝的嵌套元素print(original)#输出:[1,2,[5,4]],原对象受影响浅拷贝可以通过copy模块的copy()函数、列表的copy()方法或切片[:]实现。核心概念:切片创建新容器,但元素引用相同。copy.copy()通用所有支持拷贝的对象。2.浅拷贝的实现方式#多种浅拷贝方式lst=[10,20,30]#原列表shallow1=lst[:]#切片浅拷贝shallow2=lst.copy()#列表方法浅拷贝importcopy#导入copyshallow3=copy.copy(lst)#copy函数浅拷贝shallow1[0]=100#修改拷贝,不影响原lstprint(lst)#输出:[10,20,30]浅拷贝的局限在于嵌套可变对象共享,导致意外修改。核心概念:id()函数检查对象身份,嵌套id相同证明共享。适合扁平结构,避免深层修改。3.浅拷贝的局限性#浅拷贝局限示例importcopy#导入copyorig={'a':[1,2],'b':3}#原字典,嵌套列表shallow=copy.copy(orig)#浅拷贝print(id(orig['a'])==id(shallow['a']))#输出:True,嵌套共享shallow['a'][0]=100#修改嵌套,影响origprint(orig['a'])#输出:[100,2]深拷贝(DeepCopy)是Python中完全复制对象及其所有嵌套对象的方式,创建独立副本。核心概念:递归复制所有层级,适用于复杂结构如嵌套字典。优势:安全独立,但内存和时间开销大。4.什么是深拷贝?#深拷贝基本示例importcopy#导入copyoriginal=[1,2,[3,4]]#原列表,嵌套deep=copy.deepcopy(original)#深拷贝,递归复制deep[2][0]=5#修改嵌套,不影响原print(original)#输出:[1,2,[3,4]],原不变深浅拷贝区别在于复制深度:浅拷贝只复制顶层,深拷贝复制所有层。核心概念:在Python中,浅拷贝高效但风险共享修改;深拷贝安全但资源消耗。使用id()比较嵌套对象身份。5.深浅拷贝的区别#区别比较importcopy#导入copyorig=[[1,2],3]#原列表shallow=copy.copy(orig)#浅拷贝deep=copy.deepcopy(orig)#深拷贝print(id(orig[0])==id(shallow[0]))#输出:Trueprint(id(orig[0])==id(deep[0]))#输出:False自定义类可通过__copy__()和__deepcopy__()实现浅深拷贝。核心概念:deepcopy()需递归调用deepcopy()处理成员。用于复杂对象如带有文件柄的类。6.自定义类的拷贝实现importcopy#导入copyclassMyClass:#自定义类def__init__(self,data):self.data=data#初始化def__copy__(self):#浅拷贝方法returnMyClass(self.data)#新实例,共享datadef__deepcopy__(self,memo):#深拷贝方法returnMyClass(copy.deepcopy(self.data,memo))#递归深拷贝obj=MyClass([1,[2]])#实例deep=copy.deepcopy(obj)#调用__deepcopy__拷贝包含弱引用的对象时,默认的深拷贝可能无法正确处理弱引用指向的目标。直接拷贝后,新对象中的弱引用仍指向原对象,若原对象被回收,弱引用失效;或我们希望它指向新副本,而非原对象。核心概念在类的__deepcopy__方法中,根据memo字典获取目标对象的新副本,并重新创建指向新副本的弱引用类。7.weakref在拷贝中的应用importweakrefimportcopyclassData:passclassContainer:def__init__(self,data):self.ref=weakref.ref(data)#弱引用指向datadef__deepcopy__(self,memo):#获取data的新副本(若已拷贝过则从memo取)new_data=copy.deepcopy(self.ref(),memo)new_obj=Container(new_data)#新容器指向新数据returnnew_objd=Data()c=Container(d)c2=copy.deepcopy(c)print(c2.ref()isd)#False,指向新副本print(c2.ref()isnotNone)#True小结1.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论