我想知道python解释器在对可变对象进行深度复制时是否在写策略上应用了复制。
另外,我想知道深度复制是否也在不可变对象上执行(但这对我来说似乎很奇怪)
答案 0 :(得分:5)
它不会进行写时复制。
它不会对某些内置的不可变类型进行深层复制,但任何用户定义的“不可变”类型都将被深度复制。
copy.py in the Python 2.7 standard library在其文档中包含此消息:
此版本不会复制模块,类,函数,方法,堆栈跟踪,堆栈帧,文件,套接字,窗口,数组等类型,也不会复制类似的类型。
copy
处理这样的不可变对象:
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
for name in ("ComplexType", "UnicodeType", "CodeType"):
t = getattr(types, name, None)
if t is not None:
d[t] = _copy_immutable
deepcopy
使用了一个更复杂的方案,这个方案太长了,无法复制到最多,但要点是相同的。一个有趣的观点是_deepcopy_tuple
遍历其元素并且在找到被复制的元素之前不会创建新对象。
for i in range(len(x)):
if x[i] is not y[i]:
y = tuple(y)
break
else:
y = x
答案 1 :(得分:4)
不,它不是,只是复制对象。如果引用可变对象,它也必须复制不可变对象。
答案 2 :(得分:3)
让我们看看:
>>> import copy
>>> x = [[1],[2],"abc"]
>>> y = copy.deepcopy(x)
>>> id(x[0])
4299612960
>>> id(y[0])
4299541608
>>> id(x[2])
4297774504
>>> id(y[2])
4297774504
对于x
和y
的第一个元素,执行复制并且对象具有新ID。第三个元素是不可变的字符串,不会被复制。