字典解包运算符与copy.deepcopy的区别是什么?

3

有时候我需要深度复制一个对象,有时候这个对象是字典对象,因此我使用 ** 运算符来方便地复制它,但我一直想知道深度复制是否在某种意义上更有效或更高效。

就内存占用和 CPU 时间而言,哪个更有效率?深度复制是否像 ** 运算符一样迭代呢?

import copy
myObj = {"some": "data", "to": "copy"}

# With using unpacking operator.
newObj1 = {**myObj}

# With using `copy.deepcopy` function.
newObj2 = copy.deepcopy(myObj)
1个回答

3

注意:当字典的值可变时,这些字典值之间存在很大的差异,** 的行为与 copy.deepcopy() 不等价:

>>> import copy
>>> myObj = {"some": "data", "to": ["copy", "this"]}
>>> newObj1 = {**myObj}
>>> newObj2 = copy.deepcopy(myObj)
>>> myObj["to"][1] = "that"
>>> newObj1
{'some': 'data', 'to': ['copy', 'that']}
>>> newObj2
{'some': 'data', 'to': ['copy', 'this']}

PEP 448所示,使用 ** 可迭代解包更类似于 dict.copy()而不是 copy.deepcopy()。

所以当你改变newObj1时,真正的对象并没有被修改,但如果你改变了主要的对象,它会同时改变继承自newObj1的对象,我理解得对吗? - Guven Degirmenci
在这种情况下,更改newObj1 ['to']的元素将改变myObj。 它们都包含对同一可变列表的引用。 - Brad Solomon
好像有一些奇怪的问题:https://repl.it/talk/share/Odd-Behaviour/80345 - Guven Degirmenci
我猜这里的回答解释了问题。链接 - Guven Degirmenci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接