各类资料学习下载合集
https://pan.quark.cn/s/8c91ccb5a474
在 Python 中,数据的复制是一个重要的操作,尤其是在处理复杂数据结构(如列表、字典、集合等)时。copy
和 deepcopy
是 Python 标准库 copy
模块提供的两种复制方法。它们之间有着明显的区别,理解这些区别对于避免潜在的错误和数据问题至关重要。本文将详细介绍 copy
和 deepcopy
的用法,包括代码示例和运行结果。
浅拷贝创建一个新的对象,但它并不递归地复制对象中的子对象。也就是说,浅拷贝只复制了对象本身(即引用),而没有复制对象中的子对象的实际内容。因此,浅拷贝后的新对象与原对象共享子对象。
深拷贝则会递归地复制对象及其子对象。深拷贝创建一个新的对象,同时也会创建所有子对象的副本,因此新对象与原对象之间完全独立。
copy
和 deepcopy
copy
模块在使用 copy
和 deepcopy
之前,需要先导入 copy
模块:
import copy
# shallow_copy_example.py
import copy
# 创建一个包含嵌套列表的原始数据
original_list = [1, 2, [3, 4]]
# 使用浅拷贝
shallow_copied_list = copy.copy(original_list)
# 修改子对象
shallow_copied_list[2][0] = 'Changed'
# 输出结果
print("Original List:", original_list) # 输出: [1, 2, ['Changed', 4]]
print("Shallow Copied List:", shallow_copied_list) # 输出: [1, 2, ['Changed', 4]]
Original List: [1, 2, ['Changed', 4]]
Shallow Copied List: [1, 2, ['Changed', 4]]
original_list
是一个包含嵌套列表的列表。copy.copy()
创建了一个浅拷贝 shallow_copied_list
。shallow_copied_list
中的嵌套列表元素后,original_list
也发生了变化。这是因为两者共享同一个嵌套列表。# deep_copy_example.py
import copy
# 创建一个包含嵌套列表的原始数据
original_list = [1, 2, [3, 4]]
# 使用深拷贝
deep_copied_list = copy.deepcopy(original_list)
# 修改子对象
deep_copied_list[2][0] = 'Changed'
# 输出结果
print("Original List:", original_list) # 输出: [1, 2, [3, 4]]
print("Deep Copied List:", deep_copied_list) # 输出: [1, 2, ['Changed', 4]]
Original List: [1, 2, [3, 4]]
Deep Copied List: [1, 2, ['Changed', 4]]
copy.deepcopy()
创建了一个深拷贝 deep_copied_list
。deep_copied_list
中的嵌套列表元素后,original_list
没有发生变化。这是因为深拷贝创建了嵌套列表的一个独立副本。deepcopy
时,某些对象(如文件对象、数据库连接)可能无法被深拷贝,或者深拷贝可能会导致性能问题。__deepcopy__
方法,以便 deepcopy
能够正确复制。# custom_object_example.py
import copy
class CustomObject:
def __init__(self, value):
self.value = value
self.my_list = [1, 2, 3]
def __repr__(self):
return f"CustomObject(value={self.value}, my_list={self.my_list})"
# 创建一个对象
obj1 = CustomObject(10)
# 深拷贝
obj2 = copy.deepcopy(obj1)
# 修改深拷贝对象的属性
obj2.my_list[0] = 'Changed'
# 输出结果
print("Original Object:", obj1) # 输出: Original Object: CustomObject(value=10, my_list=[1, 2, 3])
print("Deep Copied Object:", obj2) # 输出: Deep Copied Object: CustomObject(value=10, my_list=['Changed', 2, 3])
Original Object: CustomObject(value=10, my_list=[1, 2, 3])
Deep Copied Object: CustomObject(value=10, my_list=['Changed', 2, 3])
理解 copy
和 deepcopy
的区别对于编写高效且无错误的 Python 代码至关重要。浅拷贝适用于简单对象的复制,而深拷贝适用于复杂的嵌套数据结构。通过合理使用这两种复制机制,可以有效管理和操作数据,使代码更加可靠。