我了解深层复制和浅层复制有什么区别。
深层副本将一个对象复制到另一个对象中。这意味着,如果您使 对对象副本的更改,不会影响原始对象。 在Python中,我们为此使用了deepcopy()函数,并导入了 模块副本。我们像这样使用它:
为了可视化,我使用python导师并得到了它,
import copy
a = [1, 2, 3]
b = copy.deepcopy(a)
这很有意义,因为当我使用deepcopy()
函数时它创建了一个新对象。
另一方面,浅拷贝是
但是,浅表副本会将一个对象的引用复制到另一个对象。所以, 如果我们对副本进行更改,它将影响原始对象。 为此,我们具有函数copy()。
但是当我使用浅拷贝时,为什么我得到相同的结果?
import copy
a = [1, 2, 3]
b = copy.deepcopy(a)
c = copy.copy(a)
根据我的理解,浅拷贝应引用相同的对象(即a
,而不是按以下方式创建新对象,
c = a
有人可以告诉我为什么deepcopy()
和浅表副本都创建一个新对象吗?
答案 0 :(得分:2)
copy
仅复制父对象。它创建一个新对象,该对象指向与原始对象相同的所有属性。 deepcopy
-1)复制原始对象,2)然后在指向的每个属性上运行copy
,然后复制那些其他副本所指向的任何属性,等等。
在您的情况下,由于列表的属性是不可变的,因此复制和深度复制是可以互换的。如果您有一个列表列表,或者列表列表列表,或者...,那么您可以使用Deepcopy。
这是区别的一个简短示例:
>>> example = [[1, 2, 3], [4, 5, 6]]
>>> same_obj = example
>>> shallow_copy = copy(example)
>>> deep_copy = deepcopy(example)
>>> example.append([7, 8, 9])
>>> print(example)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> print(same_obj)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> print(shallow_copy)
[[1, 2, 3], [4, 5, 6]]
>>> example[0].sort(reverse=True)
>>> print(example)
[[3, 2, 1], [4, 5, 6], [7, 8, 9]]
>>> print(shallow_copy)
[[3, 2, 1], [4, 5, 6]]
>>> print(deep_copy)
[[1, 2, 3], [4, 5, 6]]
shallow_copy
和example
是两个不同的对象。它们具有指向其他对象(在这种情况下为列表)的索引。 这些索引都指向相同的对象,因此,如果您对任一列表指向的对象进行了突变,则该突变将同时出现在两个列表中。 deepcopy
,不仅复制了父列表,而且还复制了父列表指向的每个列表。因此对子列表的任何更改都不会以任何方式影响deep_copy
。