深拷贝和浅拷贝 #
2者的主要区别在于是否会递归地拷贝子对象,浅拷贝虽然创建了一个新的容器,但容器内部元素的引用仍然是原来的。
import copy
old_list = [1, [2, 3], 4]
new_list = copy.copy(old_list) # 浅拷贝
old_list[0] = 99
print(new_list) # [1, [2, 3], 4] -> 不受影响
old_list[1][0] = 99
print(new_list) # [1, [99, 3], 4] -> 元素引用相同,受影响
import copy
old_list = [1, [2, 3], 4]
new_list = copy.deepcopy(old_list) # 深拷贝
old_list[0] = 99
old_list[1][0] = 99
print(old_list) # [99, [99, 3], 4]
print(new_list) # [1, [2, 3], 4] -> 完全不受影响
浅拷贝方式:
- 使用内置的
copy.copy()
函数 - 对于可变序列可以使用切片语法(例如
new_list = old_list[:]
)等 - 使用某些内置方法进行拷贝,如 list()、dict() 等等(这些方法往往只拷贝了一层)
深拷贝方式:
- 主要使用
copy.deepcopy()
函数
copy.deepcopy() 本质为递归调用实现,之所以不会被循环引用困住,核心原因在于它使用了一个字典(memo)来管理已经拷贝过的对象