deepcopy是否使用copy-on-write?

Emi*_*ano 5 python deep-copy copy-on-write

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

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

小智 6

它不会写入copy-copy.

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

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
Run Code Online (Sandbox Code Playgroud)

deepcopy使用一个更复杂的方案,这个方案太长了,无法复制到最多,但要点是相同的.一个有趣的观点是_deepcopy_tuple遍历其元素并且在找到被复制的元素之前不创建新对象.

for i in range(len(x)):
    if x[i] is not y[i]:
        y = tuple(y)
        break
else:
    y = x
Run Code Online (Sandbox Code Playgroud)

  • 它似乎实际上比那更聪明:根据我的测试,`(1,[2,3])`将被复制,但`(1,(2,3))`不会.显然,它会查看包含的类型以及容器. (2认同)