gpt4 book ai didi

python浅拷贝可以类似于深拷贝吗

转载 作者:太空宇宙 更新时间:2023-11-03 15:20:06 26 4
gpt4 key购买 nike

我正在玩 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 的引用。

我的问题:

如果我更改列表中的所有元素,它是否类似于深度复制?

最佳答案

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,当然......但是 c 是,正如你已经知道的, a['c'] 的浅拷贝,不是同一个对象)。

所以:

If I changed all elements in the list would it be similar to a 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

(在您的示例中,您将它们替换为完全不同且不相关的值,这根本不像一个副本......但我想我知道你的意思。)

关于python浅拷贝可以类似于深拷贝吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16323531/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com