copy

Python
浅拷贝和深拷贝
发布于

2025年9月24日

在Python中,浅拷贝(shallow copy)和深拷贝(deep copy)是用于复制对象的两种方式,主要区别在于对嵌套对象的处理方式不同:

浅拷贝(Shallow Copy)

  • 定义:只复制对象本身,而不复制对象内部的嵌套对象,新对象与原对象共享嵌套对象的引用。
  • 特点
    • 顶层对象是新的,但嵌套对象仍是原对象中嵌套对象的引用
    • 修改新对象中的嵌套对象会影响原对象,反之亦然
  • 实现方式
    • 使用切片操作 list[:]
    • 使用 copy() 方法(如列表、字典)
    • 使用 copy.copy() 函数

示例:

import copy

original = [1, 2, [3, 4]]
shallow = copy.copy(original)

shallow[0] = 100  # 只修改顶层元素,不影响原对象
shallow[2][0] = 300  # 修改嵌套列表,原对象也会受影响

print(original)  # [1, 2, [300, 4]]
print(shallow)   # [100, 2, [300, 4]]

深拷贝(Deep Copy)

  • 定义:完全复制对象及其内部的所有嵌套对象,新对象与原对象完全独立,没有任何共享引用。
  • 特点
    • 顶层对象和所有嵌套对象都是全新的
    • 修改新对象不会影响原对象,两者完全隔离
  • 实现方式
    • 使用 copy.deepcopy() 函数

示例:

import copy

original = [1, 2, [3, 4]]
deep = copy.deepcopy(original)

deep[0] = 100  # 修改顶层元素,不影响原对象
deep[2][0] = 300  # 修改嵌套列表,原对象不受影响

print(original)  # [1, 2, [3, 4]]
print(deep)      # [100, 2, [300, 4]]

总结

  • 当对象没有嵌套结构时,浅拷贝和深拷贝效果相同
  • 当对象包含嵌套结构(如列表中的列表、字典中的列表等)时:
    • 浅拷贝适合只需独立修改顶层元素的场景
    • 深拷贝适合需要完全隔离原对象和复制对象的场景(如处理复杂数据结构)
  • 深拷贝的开销通常比浅拷贝大,因为需要递归复制所有嵌套对象