类的深拷贝与浅拷贝

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)也是不同的对象。")

总结

操作方式 新对象与原对象的关系 子对象的关系
变量赋值 指向同一个对象 指向同一个子对象
浅拷贝 创建新的对象 子对象仍然相同
深拷贝 创建新的对象 子对象也完全独立
  • 变量赋值:只是将一个变量名绑定到已有的对象上,不会创建新的对象。

  • 浅拷贝:只复制对象的顶层结构,子对象仍然引用同一个对象。

  • 深拷贝:递归复制对象及其所有子对象,创建一个完全独立的新对象。

在实际开发中,选择合适的拷贝方式取决于具体需求。如果需要完全独立的对象,应使用深拷贝;如果只是需要一个新的对象,但子对象可以共享,则可以使用浅拷贝。

posted @ 2025-04-09 21:27  kyle_7Qc  阅读(20)  评论(0)    收藏  举报