Использует ли Deepcopy копирование при записи? - PullRequest
5 голосов
/ 25 июля 2011

Интересно, применяет ли интерпретатор python стратегию копирования при записи при выполнении глубокой копии на изменяемых объектах.

Кроме того, я хотел бы знать, выполняется ли глубокая копия также на неизменяемом объекте (это может показаться странныммне однако)

Ответы [ 3 ]

6 голосов
/ 25 июля 2011

Он не выполняет копирование при записи.

Он не выполняет глубокое копирование некоторых встроенных неизменяемых типов, но любые пользовательские «неизменяемые» типы будут глубоко копироваться.

copy.py в стандартной библиотеке Python 2.7 включает это сообщение в свою документацию:

Эта версия не копирует такие типы, как модуль, класс, функция,метод, ни трассировка стека, ни фрейм стека, ни файл, ни сокет, ни окно, ни массив, ни любые подобные типы.

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
4 голосов
/ 25 июля 2011

Нет, не так, просто копирует объекты.И он также должен копировать неизменяемые объекты, если они ссылаются на изменяемые.

3 голосов
/ 25 июля 2011

Посмотрим:

>>> 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 выполняется копирование, и объект имеет новый идентификатор. Третий элемент, неизменяемая строка, не копируется.

...