类的浅拷贝与深拷贝
变量的赋值操作:
- 只是形成两个变量,实际上还是指向同一个对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #变量的赋值操作 a=10 b=10 print(id(a)) #1775575198288 print(id(b)) #1775575198288 class CPU: pass class Disk: pass class Computer(CPU,Disk): def __init__(self,cpu,disk): self.cpu=cpu self.disk=disk #变量的赋值 cpu1=CPU() cpu2=cpu1 #可以发现,两个变量存储的id值都一样,都是指向那个变量 print(cpu1,id(cpu1))#1965582204880 print(cpu2,id(cpu2))#1965582204880 运算结果: 1965576579664 1965576579664 <__main__.CPU object at 0x000001C9A5D43FD0> 1965582204880 <__main__.CPU object at 0x000001C9A5D43FD0> 1965582204880 |
浅拷贝:
- python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝。因此,源对象与拷贝对象会引起同一个子对象
- python的拷贝如果没有特殊说明,都是浅拷贝
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #类的浅拷贝 print( '__________________浅拷贝___________________' ) disk=Disk() print(id(disk)) computer=Computer(cpu1,disk) #浅拷贝 import copy computer2=copy.copy(computer) print(computer,computer.cpu,computer.disk) print(computer2,computer2.cpu,computer2.disk) 运算结果: __________________浅拷贝___________________ 2210778671712 <__main__.Computer object at 0x00000202BCAD6940> <__main__.CPU object at 0x00000202BCAD6FD0> <__main__.Disk object at 0x00000202BCAD6A60> <__main__.Computer object at 0x00000202BCAD6850> <__main__.CPU object at 0x00000202BCAD6FD0> <__main__.Disk object at 0x00000202BCAD6A60> #可以发现,在该运算结果中,只有computer和computer2的id值不同,其他子对象是一样的,也就是说子对象在内存中仅有一份 |
深拷贝:
- 使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同
1 2 3 4 5 6 7 8 9 10 11 12 13 | #类的深拷贝 print( '__________________深拷贝_____________________' ) computer3=copy.deepcopy(computer) print(computer,computer.cpu,computer.disk) print(computer3,computer3.cpu,computer3.disk) 运行结果: __________________深拷贝_____________________ <__main__.Computer object at 0x0000024E2E1E6940> <__main__.CPU object at 0x0000024E2E1E6FD0> <__main__.Disk object at 0x0000024E2E1E6A60> <__main__.Computer object at 0x0000024E2E1E6760> <__main__.CPU object at 0x0000024E2E1E63D0> <__main__.Disk object at 0x0000024E2E1E6370> 可以发现不仅仅computer和computer3的id不同,他们的子对象的id也都不同(disk/cpu)。也就是说,深拷贝不仅仅复制了一份computer的实例对象,还拷贝了源对象的所有子对象 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)