python浅拷贝可以类似于deepcopies吗

2024-05-08 00:34:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我在用python玩浅拷贝。我遇到了一个意想不到的问题。你知道吗

我的假设是浅层副本是类的一个新实例,引用了类中的对象。此行为如下所示。你知道吗

>>> a = { 'a': 1, 'b':2, 'c': [[1,2],2,3,4,5,6] }
>>> c = copy.copy(a['c'])
>>> d = a['c']
>>> a['c'] is c
False
>>> a['c'][0] is c[0]
True
>>> a['c'] is d
True
>>> a['c'][0] is d[0]
True

让我吃惊的是下面这些。由于浅表复制列表的元素是对列表中来自a的元素的引用,我假设当我更改可变的第一个元素时,它也会在a中更改。你知道吗

>>> c[0] = [3,3]
>>> c
[[3, 3], 2, 3, 4, 5, 6]
>>> a
{'a': 1, 'c': [[1, 2], 2, 3, 4, 5, 6], 'b': 2}
>>> a['c'][0] is c[0]
False

我看到,由于发生了更改,第一个元素不再是a的引用。你知道吗

我的问题:

如果我改变了列表中的所有元素,它会和deepcopy相似吗?你知道吗


Tags: 对象实例falsetrue元素列表is副本
1条回答
网友
1楼 · 发布于 2024-05-08 00:34:07

As the elements of the shallow copied list are references to the elements in the list from 'a' I assumed when I changed the mutable 1st element it would also change in 'a'.

c的第一个元素是一个列表,它是可变的。所以,如果你真的对它进行了变异,结果将在a中可见。例如:

>>> a = { 'a': 1, 'b':2, 'c': [[1],2,3,4,5,6] }
>>> c = copy.copy(a['c'])
>>> c[0].append(0)
>>> a
{'a': 1, 'b':2, 'c': [[1, 0], 2, 3, 4, 5, 6]}

但是你没有改变它,你只是用一个不同的值替换了它。你知道吗

原来的值([1, 2])和新的值([3, 3])都是可变的这一事实是不相关的;你没有变异任何东西(当然,除了c……但是ca['c']的浅拷贝,不是同一个对象)。你知道吗

所以:

If I changed all elements in the list would it be similar to a deepcopy?

不,有两个理由。更改共享元素意味着您正在更改所有引用。替换列表中的所有元素将“类似于deepcopy”…但不是相同的,除非您将它们替换为deepcopy样的原始副本。如果用浅拷贝替换它们,只会将完全相同的问题向下推一级。例如:

>>> a = [[[0]]]
>>> b = copy.copy(a[0])
>>> b[0] = copy.copy(b[0])
>>> a[0] is b
False
>>> a[0][0] is b[0]
False
>>> a[0][0][0] is b[0][0]
True

(在您的示例中,您将用完全不同且不相关的值替换它们,这一点都不像副本…但我想我知道您的意思。)

相关问题 更多 >