乐闻世界logo
搜索文章和话题

什么是深拷贝?什么是浅拷贝?

浏览5
6月24日 16:43

深拷贝和浅拷贝是编程中用于复制数据结构的两种不同方法,它们在复制复杂对象(如包含其他对象的对象或数组等)时的行为上有所区别。

浅拷贝

浅拷贝(Shallow Copy)只复制对象的顶层结构,如果对象中包含了对其他对象的引用,浅拷贝不会复制被引用的对象本身,而是复制引用。因此,原始对象和浅拷贝后的对象会共享相同的引用类型数据。

例子: 假设我们有一个对象A,它包含一个指向另一个对象B的引用。如果我们对A进行浅拷贝得到A',那么A'中会有一个指向B的引用,而不是B的一个拷贝。如果我们修改B,那么这个修改会通过AA'的引用被反映出来。

python
import copy original_list = [1, 2, [3, 4]] shallow_copied_list = copy.copy(original_list) # 修改原始列表中的嵌套列表元素 original_list[2][0] = "changed" # 输出被浅拷贝的列表 print(shallow_copied_list) # 输出将会是 [1, 2, ["changed", 4]]

在这个例子中,修改原始列表中嵌套列表的元素也会影响到浅拷贝的列表,因为它们共享同一个嵌套列表对象的引用。

深拷贝

深拷贝(Deep Copy)不仅仅复制对象的顶层结构,还会递归地复制所有对象的成员,包括对象中引用的对象。这样,原始对象和深拷贝后的对象不会共享任何引用类型的数据。

例子: 使用相同的对象AB,如果我们对A进行深拷贝得到A'',那么A''将会包含一个B的完整拷贝B'。此时,如果我们修改BA''中的B'不会受到影响,因为B'是一个独立的对象。

python
import copy original_list = [1, 2, [3, 4]] deep_copied_list = copy.deepcopy(original_list) # 修改原始列表中的嵌套列表元素 original_list[2][0] = "changed" # 输出被深拷贝的列表 print(deep_copied_list) # 输出将会是 [1, 2, [3, 4]]

在这个例子中,深拷贝的列表保持原有结构,不受原始列表中嵌套列表元素修改的影响。

总结来说,浅拷贝只复制了最顶层的对象,深拷贝则是复制了所有层级的对象,确保了复制体与原始数据结构之间完全独立。在实际应用中,选择浅拷贝还是深拷贝取决于具体的需求和情况。

标签:前端