【问题标题】:visualizing difference between deep and shallow copy可视化深拷贝和浅拷贝之间的差异
【发布时间】:2019-03-13 16:58:37
【问题描述】:

我明白深拷贝和浅拷贝有什么区别。

深拷贝将一个对象复制到另一个对象中。这意味着如果你使 对对象副本的更改,不会影响原始对象。 在 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() 和浅拷贝都创建一个新对象?

【问题讨论】:

标签: python


【解决方案1】:

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

在您的情况下,由于列表的属性是不可变的,因此 copy 和 deepcopy 是可以互换的。如果你有一个列表列表,或者列表列表或者......那么你使用 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_copyexample 是两个不同的对象。它们具有指向其他对象(在本例中为列表)的索引。 这些索引都指向相同的对象,因此如果您对任一列表指向的对象进行变异,则变异会显示在两个列表中。 deepcopy,不仅复制了父列表,还复制了父列表指向的每个列表。因此对子列表的任何更改都不会以任何方式影响deep_copy

【讨论】:

    猜你喜欢
    • 2012-04-12
    • 2015-01-13
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    相关资源
    最近更新 更多