【发布时间】:2014-07-06 23:20:31
【问题描述】:
假设我有一个由immutables.组成的python列表l当我在做一个浅拷贝和一个深拷贝时,结果是一样的:
>>> a = (1,2) # immutable types
>>> b = (3,4)
>>> l = [a,b] # a list containing immutable types
>>> import copy
>>> y = copy.copy(l) # shallow copy
>>> z = copy.deepcopy(l) # deep copy
>>> id(l[0])
139857440375584
>>> id(y[0])
139857440375584
>>> id(z[0])
139857440375584 # all have the same id's , so all refer to the same object
这是否意味着浅拷贝和深拷贝只对mutable类型的集合有意义,因为immutable类型永远不会改变。
但是,如果我们想为这些类型的集合实现类似深拷贝的行为,我们该怎么做呢?
问候。
【问题讨论】:
-
所有对不可变对象的引用总是有类似深拷贝的行为(如果你复制,你永远不会看到对原始对象的更改反映在其中)。
-
@thatotherguy 这两个集合会有不同的 'ids` 并且它们的元素的 'ids' 也会不同,意味着完全重复。
-
所以你只是想看看内部 id 的变化,而不关心复制的语义?
-
@thatotherguy,我理解语义。集合的浅表副本是集合结构的副本,而不是元素的副本。使用浅拷贝,两个集合现在共享单个元素。深拷贝复制一切。一个集合的深层副本是两个集合,其中原始集合中的所有元素都是重复的。
-
@thatotherguy,你说“所有对不可变对象的引用总是有类似深拷贝的行为”。我猜它应该是类似浅拷贝的行为。
标签: python python-2.7 python-3.x deep-copy python-internals