Python: copy and deepcopy

Python: copy and deepcopy
最新回答
欲往

2020-07-08 01:35:56

在Python中,copy和deepcopy是用于复制对象的两种不同方法,它们的主要区别在于如何处理嵌套对象(如列表中的列表)。以下是对这两种方法的详细解释,以及它们与切片操作(如l1[:])的比较。

1. 切片操作 l1[:]

切片操作 l1[:] 创建了一个列表的浅拷贝。这意味着新列表 l2 将包含与 l1 相同的元素,但如果这些元素本身是可变对象(如列表),则这些元素在 l1 和 l2 中是共享的。

import copyl1 = [1, [2, 3], 4]l2 = l1[:] # 浅拷贝# 修改 l2 中的嵌套列表l2[1][0] = 'a'print(l1) # 输出: [1, ['a', 3], 4]print(l2) # 输出: [1, ['a', 3], 4]

在这个例子中,修改 l2 中的嵌套列表也会影响 l1,因为它们共享同一个嵌套列表对象。

2. copy.copy()

copy.copy() 函数也执行浅拷贝,与切片操作 l1[:] 的效果相同。它创建一个新对象,但不会递归地复制嵌套对象。

import copyl1 = [1, [2, 3], 4]l3 = copy.copy(l1) # 浅拷贝# 修改 l3 中的嵌套列表l3[1][0] = 'b'print(l1) # 输出: [1, ['b', 3], 4]print(l3) # 输出: [1, ['b', 3], 4]

同样,修改 l3 中的嵌套列表会影响 l1。

3. copy.deepcopy()

copy.deepcopy() 函数执行深拷贝,它会递归地复制所有嵌套对象,创建一个完全独立的新对象。

import copyl1 = [1, [2, 3], 4]l4 = copy.deepcopy(l1) # 深拷贝# 修改 l4 中的嵌套列表l4[1][0] = 'c'print(l1) # 输出: [1, [2, 3], 4]print(l4) # 输出: [1, ['c', 3], 4]

在这个例子中,修改 l4 中的嵌套列表不会影响 l1,因为 l4 是一个完全独立的副本。

总结
  • 切片操作 l1[:] 和 copy.copy():执行浅拷贝,新对象与原对象共享嵌套的可变对象。
  • copy.deepcopy():执行深拷贝,新对象与原对象完全独立,包括所有嵌套对象。
图片说明

以下是关于 copy 和 deepcopy 的可视化说明:

  • 浅拷贝(l1[:] 或 copy.copy()):新对象和原对象共享嵌套对象(如 [2, 3])。
  • 深拷贝(copy.deepcopy()):新对象和原对象完全独立,包括所有嵌套对象。

通过这种方式,你可以根据需要选择合适的复制方法,以避免意外的对象共享问题。