Python 列表专题:深拷贝与浅拷贝的区别
在 Python 中,拷贝列表可以分为深拷贝(deep copy)和浅拷贝(shallow copy)。这两者主要在于复制对象及其子对象的方式不同。
浅拷贝
浅拷贝只复制对象本身,而不复制对象中嵌套的对象(即子对象)。这样复制出新对象后,原对象和新对象中的子对象实际上是共享同一引用。这意味着:
- 如果原列表中的子对象发生改变(例如列表中的列表修改了元素),新列表也会相应改变。
- 浅拷贝可以使用
copy()
方法或copy
模块中的copy
函数来实现。
示例:
import copy
# 创建一个嵌套列表
original_list = [1, [2, 3], 4]
# 创建浅拷贝
shallow_copied_list = copy.copy(original_list)
# 修改原列表的子对象
original_list[1][0] = 'X'
print("Original List:", original_list)
print("Shallow Copied List:", shallow_copied_list)
输出:
Original List: [1, ['X', 3], 4]
Shallow Copied List: [1, ['X', 3], 4]
可以看到,修改了原列表中的子对象后,浅拷贝的列表也随之改变。
深拷贝
深拷贝不仅复制对象本身,还递归地复制所有子对象。这意味着:
- 原对象和新对象中的子对象都独立存在,互不影响。
- 深拷贝可以使用
copy
模块中的deepcopy
函数来实现。
示例:
import copy
# 创建一个嵌套列表
original_list = [1, [2, 3], 4]
# 创建深拷贝
deep_copied_list = copy.deepcopy(original_list)
# 修改原列表的子对象
original_list[1][0] = 'X'
print("Original List:", original_list)
print("Deep Copied List:", deep_copied_list)
输出:
Original List: [1, ['X', 3], 4]
Deep Copied List: [1, [2, 3], 4]
可以看到,深拷贝的列表没有受到原列表中子对象修改的影响,保留了原始数据。
何时使用
- 浅拷贝适用于对象层次不深,子对象是不可变对象(如数字、字符串)的情况。
- 深拷贝适用于对象层次较深,需要完全独立的副本时。
理解深拷贝和浅拷贝的区别有助于在处理复杂数据结构时做出正确的决定,避免数据的意外修改。