python中的浅/深拷贝

时间:2014-09-24 10:29:48

标签: python

从我对深度/浅层复制的理解。浅复制指定一个新标识符指向同一个对象。

>>>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)

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

1 个答案:

答案 0 :(得分: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列表也已递归复制。

相关问题