【问题标题】:Difference between dictionary unpacking operator vs copy.deepcopy?字典解包运算符与 copy.deepcopy 之间的区别?
【发布时间】:2020-11-17 15:21:50
【问题描述】:

有时我需要对一个对象进行深度复制,有时它是一个字典对象,所以我使用** 运算符轻松复制它,但我一直想知道深度复制在某种意义上是否有任何不同或有效。 就内存占用、cpu 时间和 deepcopy 是否像 ** 运算符那样进行迭代而言,哪一个更有效?

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

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

# With using `copy.deepcopy` function.
newObj2 = copy.deepcopy(myObj)

【问题讨论】:

    标签: python copy deep-copy


    【解决方案1】:

    小心;当这些字典值是可变的并且** 的行为与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中的继承对象,我做对了吗?
    • @GuvenDegirmenci 在这种情况下,更改newObj1['to'] 的元素将改变myObj。它们都包含对同一个可变列表的引用。
    • 看起来有一些奇怪的问题:repl.it/talk/share/Odd-Behaviour/80345
    • 我猜这个答案here 解释了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 2016-05-18
    • 2011-10-22
    • 2012-10-06
    • 1970-01-01
    • 2010-12-30
    • 2013-04-26
    相关资源
    最近更新 更多