5

我想知道在对可变对象进行深度复制时,python 解释器是否在写入策略上应用复制。

另外,我想知道深度复制是否也在非可变对象上执行(但这对我来说似乎很奇怪)

4

3 回答 3

6

它不执行写时复制。

它不会对某些内置的不可变类型进行深度复制,但任何用户定义的“不可变”类型都会被深度复制。

Python 2.7 标准库中的 copy.py 在其文档中包含此消息:

此版本不复制模块、类、函数、方法、堆栈跟踪、堆栈帧、文件、套接字、窗口、数组等类型,也不复制任何类似类型。

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
于 2011-07-25T16:57:49.927 回答
4

不,不是,只是复制对象。如果它们引用可变对象,它还必须复制不可变对象。

于 2011-07-25T16:53:58.457 回答
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

对于 and 的第一个元素xy执行复制并且对象有一个新的 id。第三个元素,一个不可变的字符串,不会被复制。

于 2011-07-25T16:56:43.457 回答