Он не выполняет копирование при записи.
Он не выполняет глубокое копирование некоторых встроенных неизменяемых типов, но любые пользовательские «неизменяемые» типы будут глубоко копироваться.
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