Python Shallow and Deep Copy

一言以蔽之,Shallow Copy 不会递归地拷贝复合数据类型中的嵌套元素(如列表中的列表),因为其使用的是引用的方式来指向原复合数据类型中的嵌套元素。

举例而言,有以下的列表:

import copy

old_list = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
new_list = copy.copy(old_list)

old_list[1][1] = 'AA'

print("Old list:", old_list)
print("New list:", new_list)

其输出结果为:

Old list: [[1, 1, 1], [2, 'AA', 2], [3, 3, 3]]
New list: [[1, 1, 1], [2, 'AA', 2], [3, 3, 3]]

可以看到,新列表中的元素也被更改,这是因为内嵌元素是只被引用,而不是完全的拷贝。

深拷贝则会递归地将复合类型中的元素拷贝到新的复合类型对象中。

import copy

old_list = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
new_list = copy.deepcopy(old_list)

old_list[1][0] = 'BB'

print("Old list:", old_list)
print("New list:", new_list)

其结果如下:

Old list: [[1, 1, 1], ['BB', 2, 2], [3, 3, 3]]
New list: [[1, 1, 1], [2, 2, 2], [3, 3, 3]]

深拷贝可能会遇到的问题:

  1. 复合类型的中的元素可能指向自己,会导致陷入递归循环。

解决办法:

  1. 使用一个 memo 字典来记录已经拷贝过的元素。

Reference

  1. Python Shallow Copy and Deep Copy
  2. Python copy module