模块介绍
copy 是 Python 标准库中的一个模块,提供了用于对象拷贝的工具,主要有两种拷贝方式:浅拷贝(shallow copy)和 深拷贝(deep copy)。这两种拷贝方式的主要区别在于是否递归地拷贝嵌套对象(例如列表中的列表)。
使用场景
- 浅拷贝:适用于当你不需要递归拷贝所有嵌套对象,仅仅需要复制最外层对象的情况。例如,你只需要复制一个列表本身,而不关心列表中的嵌套列表是否需要被单独拷贝。
- 深拷贝:适用于你需要完全独立的副本的情况,即原始对象及其所有嵌套对象的副本都不共享任何引用。
主要函数
函数 | 描述 |
---|---|
copy() | 创建并返回对象的浅拷贝(仅复制对象的第一层,嵌套对象仍然引用原对象)。 |
deepcopy() | 创建并返回对象的深拷贝(递归地复制所有层级的对象,完全独立于原对象)。 |
- copy()
浅拷贝创建一个新的对象,但不会递归地拷贝嵌套对象,而是直接引用原对象中的子对象。
import copy
# 创建一个包含嵌套列表的原始对象
original = [1, 2, [3, 4]]
# 浅拷贝原始对象
shallow_copy = copy.copy(original)
# 修改嵌套列表的元素
shallow_copy[2][0] = 99
print("Original:", original) # 输出: Original: [1, 2, [99, 4]]
print("Shallow Copy:", shallow_copy) # 输出: Shallow Copy: [1, 2, [99, 4]]
- deepcopy()
深拷贝递归地拷贝对象及其所有嵌套对象,这意味着原始对象和拷贝对象之间的所有引用关系都会被切断,修改拷贝对象中的元素不会影响原始对象。
import copy
# 创建一个包含嵌套列表的原始对象
original = [1, 2, [3, 4]]
# 深拷贝原始对象
deep_copy = copy.deepcopy(original)
print("Original:", original) # 输出: Original: [1, 2, [3, 4]]
print("Deep Copy:", deep_copy) # 输出: Deep Copy: [1, 2, [99, 4]]
# 修改嵌套列表的元素
deep_copy[2][0] = 99
print("Change Copy:", deep_copy) # 输出: Change Copy: [1, 2, [99, 4]]
深浅拷贝比较
特性 | 浅拷贝:copy() | 深拷贝:deepcopy() |
---|---|---|
拷贝层次 | 只复制对象本身,嵌套对象仍然引用原对象中的嵌套对象。 | 递归地复制对象及其所有嵌套对象,创建一个完全独立的副本。 |
修改影响 | 修改嵌套对象会影响原对象和拷贝对象。 | 修改任何嵌套对象或原始对象不会影响到另一个对象。 |
性能 | 浅拷贝速度较快,因为它只复制对象的第一层。 | 深拷贝比较慢,因为它需要递归地复制所有层级的对象。 |
注意事项
- copy.copy() 和 copy.deepcopy() 都不会对不可变类型(如整数、字符串、元组)进行复制,因为这些对象是不可变的,它们本身就不能被修改。因此,对于这些类型的对象,浅拷贝和深拷贝的效果是一样的。
总结
- 浅拷贝 copy():只复制对象的第一层,嵌套对象仍然指向原对象的引用。
- 深拷贝 deepcopy():递归地复制对象及其嵌套对象,确保原始对象和拷贝对象完全独立。