Python中浅拷贝与深拷贝的区别及实例解析
本文通过Python代码实例,详细对比了普通赋值、浅拷贝(copy.copy)和深拷贝(copy.deepcopy)在内存处理上的差异。重点解析了嵌套列表中内部对象引用关系的改变,说明浅拷贝仅复制第一层对象而共享内部引用,深拷贝则递归创建完整副本,确保修改原数据不影响副本。
Python基础教程之浅拷贝和深拷贝实例详解
网络上关于Python深拷贝与浅拷贝的讨论众多,本文将对三种常见的数据复制方式进行对比,并附带具体代码实例供参考。
普通的赋值操作
#encoding:utf-8 #定义一个嵌套集合 lista=[1,2,3,[4,5,6,[7,8,9]]] listb=lista #分别打印出 lista和listb的地址值 print id(lista) #4511103096 print id(listb) #4511103096 #修改lista中的内容,listb中的内容也会跟着修改 lista[0]=0 print lista #[0, 2, 3, [4, 5, 6, [7, 8, 9]]] print listb #[0, 2, 3, [4, 5, 6, [7, 8, 9]]]
通过上述实践可以发现,普通的赋值操作仅仅是让变量listb指向了变量lista在内存中已有的地址,而并没有在内存中创建新的对象空间。
浅拷贝操作
#encoding:utf-8 #定义一个嵌套集合 import copy lista=[1,2,3,[4,5,6,[7,8,9]]] #使用copy模块中copy方法 listb=copy.copy(lista) print id(lista) #4396231640 print id(listb) #4396231712 #发现lista和listb在内存中的地址有区别, #打印元素中的第一个元素的地址值 print id(lista[0])#140666751466536 print id(listb[0])#140666751466536 #元素的地址值是一样的,是不是意思就是,改变lista中的第一个元素, # listb中的也要改变呢 lista[0]=0 print lista #[0, 2, 3, [4, 5, 6, [7, 8, 9]]] print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]] #结果发现,竟然没有跟着lista一起改变,为什么呢,因为使用了浅拷贝呗 #我们在打印下lista[0]和listb[0]的地址 print id(lista[0]) #140666751466560 print id(listb[0]) #140666751466536 #会发现lista[0]重新指向内存中的其他地址 #这时候可以通过以上的方法,修改lista[3],lista[3]也是一个list print id(lista[3])#4499779240 print id(listb[3])#4499779240 #修改lista[3]中第一个元素呢 lista[3][0]=0 print lista #[0, 2, 3, [0, 5, 6, [7, 8, 9]]] print listb #[0, 2, 3, [0, 5, 6, [7, 8, 9]]] #发现修改lista[3][0]元素的值,listb[3][0]也会跟着改变
根据以上实践结果可知,浅拷贝并未对对象内部的子对象进行独立的拷贝处理。
深拷贝操作
#encoding:utf-8 #定义一个嵌套集合 import copy lista=[1,2,3,[4,5,6,[7,8,9]]] #深拷贝功能是在浅拷贝上做的加强,所以具备浅拷贝的功能 listb=copy.deepcopy(lista) lista[3][0]=0 print lista #[1, 2, 3, [0, 5, 6, [7, 8, 9]]] print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]] #深拷贝会解决修改lista[3][0]值不会影响listb中的值 #再来修改下第三层列表中元素是不是也完成拷贝 lista[3][3][0]=0 print lista #[1, 2, 3, [0, 5, 6, [0, 8, 9]]] print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]] #没有受到任何影响
感谢阅读,希望本文能对大家有所帮助,感谢各位对本站的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









