【问题标题】:Shallow/Deep copy in python [duplicate]python中的浅/深复制[重复]
【发布时间】:2014-11-18 19:29:20
【问题描述】:

根据我对深/浅复制的理解。浅拷贝会分配一个新的标识符来指向同一个对象。

>>>x = [1,2,3]
>>>y = x
>>>x,y
([1,2,3],[1,2,3])
>>>x is y
True
>>>x[1] = 14
>>>x,y
([1,14,3],[1,14,3])

深拷贝创建一个具有同等价值的新对象:

>>>import copy
>>>x = [1,2,3]
>>>y = copy.deepcopy(x)
>>>x is y
False
>>>x == y
True
>>>x[1] = 14
>>>x,y
([1,14,3],[1,2,3])

我的困惑是如果x=y 创建了一个浅拷贝,而 copy.copy() 函数也创建了一个对象的浅拷贝,那么:

>>> import copy
>>> x = [1,2,3]
>>> y = x
>>> z = copy.copy(x)
>>> x is y
True
>>> x is z
False
>>> id(x),id(y),id(z)
(4301106640, 4301106640, 4301173968)

如果它应该是浅拷贝,为什么要创建一个新对象?

【问题讨论】:

  • x = y 只是对同一个对象的新赋值,不会发生复制。
  • 那么如果copy.deepcopy()和copy.copy()都在内存中创建一个新地址的新对象,有什么区别呢?
  • copy.copy 只影响外部容器,内部对象不会受到影响。这就是 deepcopy 发挥作用的地方,它将递归地创建所有包含对象的副本。例如,尝试使用列表列表。相关:stackoverflow.com/a/17599215/846892

标签: python


【解决方案1】:

浅拷贝创建一个新的列表对象并复制源列表中包含的所有引用。深拷贝递归地创建新对象。

您不会看到仅使用不可变内容的区别。使用嵌套列表查看区别:

>>> import copy
>>> a = ['foo', 'bar', 'baz']
>>> b = ['spam', 'ham', 'eggs']
>>> outer = [a, b]
>>> copy_of_outer = copy.copy(outer)
>>> outer is copy_of_outer
False
>>> outer == copy_of_outer
True
>>> outer[0] is a
True
>>> copy_of_outer[0] is a
True
>>> outer[0] is copy_of_outer[0]
True

外部列表的新副本已创建,但原始列表和副本的内容仍然是相同的对象。

>>> deep_copy_of_outer = copy.deepcopy(outer)
>>> deep_copy_of_outer[0] is a
False
>>> outer[0] is deep_copy_of_outer[0]
False

深拷贝不与原始共享内容; a 列表也已被递归复制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-14
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多