首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >浅、深拷贝的形象化差异

浅、深拷贝的形象化差异
EN

Stack Overflow用户
提问于 2018-10-09 01:33:41
回答 1查看 651关注 0票数 2

我理解深拷贝和浅拷贝之间的区别。

深拷贝将对象复制到另一个对象中。这意味着,如果您更改对象的副本,它将不会影响原始对象。在Python中,我们为此使用了函数deepcopy(),并导入了模块副本。我们用它就像:

为了让它形象化,我请了python家教,

代码语言:javascript
运行
复制
import copy
a = [1, 2, 3]

b = copy.deepcopy(a)

这是有意义的,因为当我使用deepcopy()函数时,它创建了一个新对象。

另一方面,浅薄的拷贝是,

但是,浅表副本将一个对象的引用复制到另一个对象。因此,如果我们修改副本,它将影响原始对象。为此,我们有函数copy()。

但是当我使用浅拷贝时,为什么我会得到同样的结果呢?

代码语言:javascript
运行
复制
import copy
a = [1, 2, 3]

b = copy.deepcopy(a)
c = copy.copy(a)

据我理解,浅拷贝应该引用相同的对象(即a,而不是创建新对象,如下所示,

代码语言:javascript
运行
复制
c = a

有人能告诉我为什么deepcopy()和浅拷贝都创建新对象吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-09 02:24:37

copy只复制父对象。它生成一个指向与原始对象相同的所有属性的新对象。deepcopy - 1)复制原始对象,2)然后对指向的每个属性运行copy,然后复制那些其他副本指向的任何属性,等等.

在这种情况下,由于列表的属性是不可变的,所以复制和深度复制是可互换的。如果你有一个列表,或者列表列表,或者.那你就用深度拷贝。

下面是这种区别的一个快速例子:

代码语言:javascript
运行
复制
>>> 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_copyexample是两个不同的对象。它们有指向其他对象的索引(在本例中为列表)。这些索引都指向相同的对象(),因此如果您更改列表所指向的对象,则两个列表中都会出现突变。deepcopy,不仅复制父列表,还复制父列表指向的每个列表。因此,对子列表的任何更改都不会以任何方式影响deep_copy

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52712139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档