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 3
print(p2.x, p2.y) # 2 3
print(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 模块会优先调用它们。
“点赞有美意,赞赏是鼓励”
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.