我理解深拷贝和浅拷贝之间的区别。
深拷贝将对象复制到另一个对象中。这意味着,如果您更改对象的副本,它将不会影响原始对象。在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()
和浅拷贝都创建新对象吗?
发布于 2018-10-09 02:24:37
copy
只复制父对象。它生成一个指向与原始对象相同的所有属性的新对象。deepcopy
- 1)复制原始对象,2)然后对指向的每个属性运行copy
,然后复制那些其他副本指向的任何属性,等等.
在这种情况下,由于列表的属性是不可变的,所以复制和深度复制是可互换的。如果你有一个列表,或者列表列表,或者.那你就用深度拷贝。
下面是这种区别的一个快速例子:
>>> 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
。
https://stackoverflow.com/questions/52712139
复制相似问题