Python 库手册:copy 对象拷贝

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 模块会优先调用它们。

图片

“点赞有美意,赞赏是鼓励”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值