浅复制和深复制
2022/2/2 23:17:38
本文主要是介绍浅复制和深复制,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录- 浅复制(拷贝)
- 深拷贝
- 不要使用可变参数做默认值
浅复制(拷贝)
浅复制:如果容器中有可变对象如,列表,字典等,那么副本中存在的是源容器可变对象的引用
复制列表的两种方式:
>>> L1 = [1,2,3,4] >>> L2 = list(L1) # 方式一 >>> L3 = L1[:] # 方式二 >>> L1 == L2 == L3 True >>> L1 is L2 False >>> L2 is L3 False
深拷贝
深复制:副本不共享内部对象的引用,copy 模块的deepcopy()做深复制, copy()做浅复制
实例代码:
import copy class Bus: def __init__(self, passengers=None): if passengers is None: self.passengers = [] else: self.passengers = list(passengers) def pick(self, name): self.passengers.append(name) def drop(self, name): self.passengers.remove(name) if __name__ == '__main__': bus1 = Bus(['zhangfei', 'zhugeliang', 'zhaoyun', 'liubei']) bus2 = copy.copy(bus1) # 浅复制 bus3 = copy.deepcopy(bus1) # 深复制 print(id(bus1), id(bus2), id(bus3)) # out: 2154872061904 2154872061376 2154872056672 bus1.drop('zhugeliang') print(bus2.passengers) # out: ['zhangfei', 'zhaoyun', 'liubei'] # out: 2847485108864 2847485108864 2847481853376 # bus1 和 bus2 的 passengers 共享,因为浅拷贝 print(id(bus1.passengers), id(bus2.passengers), id(bus3.passengers)) print(bus3.passengers) # out: ['zhangfei', 'zhugeliang', 'zhaoyun', 'liubei'] 没有变化
不要使用可变参数做默认值
在函数内部如果有传入可变参数,最好使用副本操作,这样不会影响外部,除非这个方法方法确实想修改通过参数传入的对象
这篇关于浅复制和深复制的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide
- 2025-01-11不得不了解的高效AI办公工具API
- 2025-01-102025 蛇年,J 人直播带货内容审核团队必备的办公软件有哪 6 款?
- 2025-01-10高效运营背后的支柱:文档管理优化指南
- 2025-01-10年末压力山大?试试优化你的文档管理
- 2025-01-10跨部门协作中的进度追踪重要性解析
- 2025-01-10总结 JavaScript 中的变体函数调用方式
- 2025-01-10HR团队如何通过数据驱动提升管理效率?6个策略
- 2025-01-10WBS实战指南:如何一步步构建高效项目管理框架?