开发者

Does deepcopy use copy-on-write?

I wonder开发者_StackOverflow社区 if the python interpreter applies copy on write strategy when doing a deepcopy on mutable objects.

Also, I'd like to know if the deepcopy is performed also on nonmutable object (that would seem strange to me however)


It does not do copy-on-write.

It doesn't do a deep copy on some built-in immutable types, but any user-defined "immutable" types will be deep-copied.

copy.py in the Python 2.7 standard library includes this message in its documentation:

This version does not copy types like module, class, function, method, nor stack trace, stack frame, nor file, socket, window, nor array, nor any similar types.

copy handles immutable objects like this:

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 uses a more complicated scheme that's too long to copy into this most, but the gist is the same. One interesting point is that _deepcopy_tuple iterates through its elements and don't create a new object until it finds an element that was copied.

for i in range(len(x)):
    if x[i] is not y[i]:
        y = tuple(y)
        break
else:
    y = x


No, it doesn't it, just copies the objects. And it also must copy immutable objects if they reference mutables.


Let's see:

>>> 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

For the first element of x and y, the copy is performed and the object has a new id. The third element, an immutable string, is not copied.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜