copy 是 Python 标准库中的一个模块,提供了对象浅拷贝(shallow copy)和深拷贝(deep copy)的功能。它解决了直接赋值引用同一对象导致数据被意外修改的问题,常用于需要复制列表、字典、用户自定义对象等可变数据结构的场景。
常见应用场景:
(1)避免数据引用共享
防止不同变量指向同一个可变对象时,相互修改造成数据污染。
(2)数据快照备份
复制当前数据状态,在后续操作出错时可回滚。
(3)复杂嵌套结构复制
深拷贝可以一次性复制多层嵌套的容器对象,互不影响。
(4)自定义对象的复制
复制类实例,包括属性值和嵌套对象。
◆ ◆ ◆
核心概念
1、赋值(assignment)
b = a 只是让 b 引用 a,不会创建新对象。修改 b 会影响 a(如果是可变对象)。
2、浅拷贝(shallow copy)
创建一个新对象,但内部元素的引用保持不变(一级复制,子对象共用引用)。
3、深拷贝(deep copy)
创建一个新对象,同时递归复制其所有子对象,完全独立。
4、自定义拷贝行为
类可以定义 __copy__(浅拷贝)和 __deepcopy__(深拷贝)方法来控制复制方式。
◆ ◆ ◆
基本用法
import copy
# 浅拷贝new_obj = copy.copy(original_obj)
# 深拷贝new_obj = copy.deepcopy(original_obj)
◆ ◆ ◆
应用举例
例 1、赋值 vs 浅拷贝
import copy
a = [1, 2, [3, 4]]
b = a # 赋值(同一对象引用)c = copy.copy(a) # 浅拷贝(一级对象独立)
a.append(5)a[2].append(6)
print("a:", a) # [1, 2, [3, 4, 6], 5]print("b:", b) # 与 a 相同print("c:", c) # [1, 2, [3, 4, 6]] -> 子列表仍然共享
说明:
浅拷贝只复制外层列表,内部子列表依然共享引用。
例 2、深拷贝避免共享
import copy
a = [1, 2, [3, 4]]
d = copy.deepcopy(a) # 深拷贝(完全独立)
a[2].append(6)
print("a:", a) # [1, 2, [3, 4, 6]]print("d:", d) # [1, 2, [3, 4]] -> 子列表不受影响
例 3、自定义对象复制
import copy
class Point: def __init__(self, x, y): self.x = x self.y = y
p1 = Point(2, 3)p2 = copy.copy(p1) # 浅拷贝p3 = copy.deepcopy(p1) # 深拷贝
print(p1.x, p1.y) # 2 3print(p2.x, p2.y) # 2 3print(p3.x, p3.y) # 2 3
说明:
如果类属性中有可变对象,深拷贝才能完全独立。
◆ ◆ ◆
常用函数速览
copy.copy(x)
返回 x 的浅拷贝。
参数:
x:要复制的对象
返回:复制后的新对象(外层独立,内层引用共享)
copy.deepcopy(x, memo=None)
返回 x 的深拷贝。
参数:
x:要复制的对象。
memo:递归拷贝时使用的字典,防止循环引用导致无限递归(通常不用手动传)
返回:复制后的新对象(完全独立)
◆ ◆ ◆
补充说明
1、不可变对象(int、float、str、tuple)
浅拷贝与深拷贝对它们没有区别,因为它们本身不能被修改。
2、性能考虑
深拷贝比浅拷贝慢,占用更多内存,应在确有需要时使用。
3、循环引用
deepcopy 会自动处理对象之间的循环引用,不会无限递归。
4、自定义类的复制控制
如果类实现了 __copy__ 或 __deepcopy__,copy 模块会优先调用它们。
“点赞有美意,赞赏是鼓励”