Python中的深拷贝与浅拷贝
字数 489 2025-11-02 09:29:26
Python中的深拷贝与浅拷贝
描述
在Python中,深拷贝和浅拷贝是处理对象复制的两种不同方式。当我们需要复制一个包含其他对象引用的复合对象(如列表、字典等)时,理解这两种拷贝的区别至关重要。浅拷贝只复制对象本身,而不复制其引用的子对象;深拷贝则递归地复制对象及其所有子对象。
基本概念
- 直接赋值:只是创建一个新变量引用原对象,两者指向同一内存地址
- 浅拷贝:创建新对象,但包含对原对象内容的引用
- 深拷贝:创建新对象,并递归复制所有子对象
示例演示
- 直接赋值的情况
original_list = [1, 2, [3, 4]]
assigned_list = original_list # 直接赋值
print(id(original_list) == id(assigned_list)) # True,指向同一对象
- 浅拷贝的实现方式
import copy
original_list = [1, 2, [3, 4]]
shallow_copied = copy.copy(original_list) # 浅拷贝
print(id(original_list) == id(shallow_copied)) # False,外层列表是新对象
print(id(original_list[2]) == id(shallow_copied[2])) # True,内层列表是同一对象
- 深拷贝的实现方式
import copy
original_list = [1, 2, [3, 4]]
deep_copied = copy.deepcopy(original_list) # 深拷贝
print(id(original_list) == id(deep_copied)) # False
print(id(original_list[2]) == id(deep_copied[2])) # False,内层列表也是新对象
修改操作的对比
- 修改外层元素
original_list = [1, 2, [3, 4]]
shallow_copied = copy.copy(original_list)
original_list[0] = 100
print(original_list) # [100, 2, [3, 4]]
print(shallow_copied) # [1, 2, [3, 4]],不受影响
- 修改内层可变对象
original_list = [1, 2, [3, 4]]
shallow_copied = copy.copy(original_list)
original_list[2].append(5)
print(original_list) # [1, 2, [3, 4, 5]]
print(shallow_copied) # [1, 2, [3, 4, 5]],同时被修改!
实际应用场景
- 适合使用浅拷贝的情况
- 对象内部只有不可变类型时
- 确实需要共享某些子对象时
- 性能要求较高且能确保安全时
- 必须使用深拷贝的情况
- 需要完全独立的副本时
- 对象包含多层嵌套结构时
- 需要修改副本而不影响原对象时
总结
理解深拷贝和浅拷贝的关键在于认识到Python中对象的引用特性。浅拷贝创建"表层"副本,深拷贝创建"完全独立"的副本。在实际编程中,应根据具体需求选择合适的拷贝方式,避免因意外的对象共享导致程序错误。