在Python中,深拷贝(deep copy)和浅拷贝(shallow copy)是用于复制对象的两种方式。
先通俗地解释一下深拷贝和浅拷贝。
想象一下你有一个盒子(原始对象),里面装着几本书(数据)。现在你想要复制这个盒子,得到一个全新的一样的盒子(新对象)。这时候就涉及到了深拷贝和浅拷贝的概念。
浅拷贝就像是将原来的盒子完全复制一份。新盒子里放着跟原来盒子相同的书。但是如果其中有些书是其他人也有的,那么两个盒子里放的其实是同样的书。这意味着,如果你在新盒子中加入或移除书籍,那么原来的盒子也会被影响到。因为他们共享同样的引用关系。
而深拷贝则更彻底。它不仅会复制整个盒子,还会将每本书都重新复制一份放进去。这样两个盒子之间没有任何关联,修改其中一个不会对另一个产生影响。
所以说,浅拷贝只复制了外层对象(引用或指针),而深拷贝则逐层地将所有嵌套对象都进行复制。
所以,浅拷贝会创建一个新的对象,并将原始对象的引用复制到新对象中。这意味着修改新对象可能会影响原始对象。而深拷贝则会创建一个全新的独立对象,并且递归地将原始对象及其所有嵌套对象完整复制到新对象中,因此对新对象的任何修改不会影响原始对象。
使用场景:
- 浅拷贝适用于需要复制简单数据类型或者只需一层复制的情况。它可以节省内存并提高性能。
- 深拷贝适用于需要独立副本,且涉及嵌套或可变数据结构的情况。它确保在修改副本时不会影响到原始数据。
简单示例:
# 浅拷贝示例import copylist1 = [1, 2, [3, 4]]list2 = list1.copy()# 或者 list2 = copy.copy(list1)list2[0] = 5list2[2].append(6)print(list1)# [1, 2, [3, 4, 6]]print(list2)# [5, 2, [3, 4, 6]]# 深拷贝示例import copylist1 = [1, 2, [3, 4]]list2 = copy.deepcopy(list1)list2[0] = 5list2[2].append(6)print(list1)# [1, 2, [3, 4]]print(list2)# [5, 2, [3, 4, 6]]
在浅拷贝示例中,修改了列表 list2
的第一个元素和第三个元素的子列表。这导致原始列表 list1
被影响。
而在深拷贝示例中,即使对副本进行了修改,原始列表保持不变。