类的深拷贝与浅拷贝
Python 中的变量赋值、浅拷贝与深拷贝
在 Python 中,对象的复制可以通过变量赋值、浅拷贝和深拷贝来实现。它们在处理对象及其子对象时的行为有所不同。以下是详细说明和示例代码:
1. 变量赋值
变量赋值只是将一个变量名绑定到一个对象上,实际上两个变量指向同一个对象。对对象的修改会同时反映在两个变量上。
2. 浅拷贝
浅拷贝会创建一个新的对象,但只复制对象的顶层结构,不会递归复制子对象。因此,源对象与拷贝对象的子对象会引用同一个对象。
3. 深拷贝
深拷贝会递归地复制对象及其所有子对象,创建一个完全独立的新对象。源对象与拷贝对象及其子对象都互不相同。
示例代码
# 定义类
class Cpu:
pass
class Disk:
pass
class Computer:
def __init__(self, cpu, disk):
self.cpu = cpu # Cpu 实例作为子对象
self.disk = disk # Disk 实例作为子对象
# 创建对象
cpu = Cpu()
disk = Disk()
# 创建 Computer 对象
com = Computer(cpu, disk)
# 1. 变量赋值
com1 = com
print("变量赋值:")
print("com 的内存地址:", com, "子对象的内存地址:", com.cpu, com.disk)
print("com1 的内存地址:", com1, "子对象的内存地址:", com1.cpu, com1.disk)
# 输出:
# com 的内存地址: <__main__.Computer object at 0x...> 子对象的内存地址: <__main__.Cpu object at 0x...> <__main__.Disk object at 0x...>
# com1 的内存地址: <__main__.Computer object at 0x...> 子对象的内存地址: <__main__.Cpu object at 0x...> <__main__.Disk object at 0x...>
print("结论:变量赋值后,com 和 com1 指向同一个对象及其子对象。\n")
# 2. 浅拷贝
import copy
com2 = copy.copy(com)
print("浅拷贝:")
print("com 的内存地址:", com, "子对象的内存地址:", com.cpu, com.disk)
print("com2 的内存地址:", com2, "子对象的内存地址:", com2.cpu, com2.disk)
# 输出:
# com 的内存地址: <__main__.Computer object at 0x...> 子对象的内存地址: <__main__.Cpu object at 0x...> <__main__.Disk object at 0x...>
# com2 的内存地址: <__main__.Computer object at 0x...> 子对象的内存地址: <__main__.Cpu object at 0x...> <__main__.Disk object at 0x...>
print("结论:浅拷贝后,com 和 com2 是不同的对象,但它们的子对象(cpu 和 disk)是同一个对象。\n")
# 3. 深拷贝
com3 = copy.deepcopy(com)
print("深拷贝:")
print("com 的内存地址:", com, "子对象的内存地址:", com.cpu, com.disk)
print("com3 的内存地址:", com3, "子对象的内存地址:", com3.cpu, com3.disk)
# 输出:
# com 的内存地址: <__main__.Computer object at 0x...> 子对象的内存地址: <__main__.Cpu object at 0x...> <__main__.Disk object at 0x...>
# com3 的内存地址: <__main__.Computer object at 0x...> 子对象的内存地址: <__main__.Cpu object at 0x...> <__main__.Disk object at 0x...>
print("结论:深拷贝后,com 和 com3 是不同的对象,它们的子对象(cpu 和 disk)也是不同的对象。")
总结
| 操作方式 | 新对象与原对象的关系 | 子对象的关系 |
|---|---|---|
| 变量赋值 | 指向同一个对象 | 指向同一个子对象 |
| 浅拷贝 | 创建新的对象 | 子对象仍然相同 |
| 深拷贝 | 创建新的对象 | 子对象也完全独立 |
-
变量赋值:只是将一个变量名绑定到已有的对象上,不会创建新的对象。
-
浅拷贝:只复制对象的顶层结构,子对象仍然引用同一个对象。
-
深拷贝:递归复制对象及其所有子对象,创建一个完全独立的新对象。
在实际开发中,选择合适的拷贝方式取决于具体需求。如果需要完全独立的对象,应使用深拷贝;如果只是需要一个新的对象,但子对象可以共享,则可以使用浅拷贝。

浙公网安备 33010602011771号