假设我在执行l
浅拷贝和深拷贝时,有一个由immutables.
组成的python列表,结果是相同的:
>>> 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
类型从不更改。但是,如果我们想要为这些类型的集合实现类似于的深拷贝行为,我们如何做到这一点?
致以问候。
发布于 2014-05-19 05:43:18
由于不能更改不可变对象,所以在复制时创建不可变对象的副本是没有意义的。
浅拷贝
根据's source code,不可变类型的浅拷贝如下所示
def _copy_immutable(x):
return x
for t in (type(None), int, long, float, bool, str, tuple,
frozenset, type, xrange, types.ClassType,
types.BuiltinFunctionType, type(Ellipsis),
types.FunctionType, weakref.ref):
d[t] = _copy_immutable
对于所有不可变类型,_copy_immutable
函数在浅层复制期间按原样返回对象。
深拷贝
同样,在元组的深度复制过程中,对象按原样返回,如 function所示,
d = id(x)
try:
return memo[d]
发布于 2014-05-19 05:53:17
第四部分解释了为什么没有区别。如果你想做任何事,你都可以通过腌制来实现:
import pickle
a = (1,2)
b = (3,4)
l = [a,b]
z = pickle.loads(pickle.dumps(l))
print id(l[0])
print id(z[0])
显然,这不应该是必要的。
发布于 2014-05-19 16:38:56
针对这种特殊情况,对创建小整数对象进行了优化。即使在执行简单的任务时,您也可以观察到对象的相同标识,即使它们不应该相互了解:
>>> a = 1
>>> b = 5
>>> c = 1
>>> d = 5
>>> id(a)
1815461288
>>> id(c)
1815461288
>>> id(b)
1815461352
>>> id(d)
1815461352
https://stackoverflow.com/questions/23730279
复制相似问题