В чем именно заключается связь между pickle
и copy.deepcopy
? Какие механизмы они разделяют, и как?
Понятно, что эти два являются тесно связанными операциями и совместно используют некоторые механизмы/протоколы, но я не могу обернуть голову вокруг деталей.
Некоторые (запутанные) вещи, которые я узнал:
- Если класс определяет
__[gs]etstate__
, они вызываются наdeepcopy
своих экземпляров. Сначала это меня удивило, потому что я думал, что они специфичны дляpickle
, но потом я обнаружил, что Классы могут использовать одни и те же интерфейсы для управления копированием, которые они используют для управления травлением. Однако нет документации о том, как__[gs]etstate__
используется при глубокой копировании (как используется значение, возвращаемое из__getstate__
, то, что передается на__setstate__
?) - Наивная альтернативная реализация
deepcopy
будетpickle.loads(pickle.dumps(obj))
. Тем не менее, это не может быть эквивалентно deepcopy'ing, потому что если класс определяет операцию__deepcopy__
, он не будет вызван с использованием этой глубокой копии, основанной на pickle. (Я также наткнулся на утверждение, что глубокая копия является более общей, чем рассол, и существует много типов, которые являются глубококопируемыми, но не разборчивыми.)
(1) указывает общность, а (2) указывает разницу между pickle
и deepcopy
.
Кроме того, я нашел эти два противоречивых утверждения:
copy_reg: модули рассола, cPickle и copy используют эти функции при травлении/копировании этих объектов
и
Модуль copy не использует модуль регистрации copy_reg
Это, с одной стороны, является еще одним признаком отношения/общности между pickle
и deepcopy
, а с другой стороны, способствует моей путанице...
[Мой опыт работы с python2.7, но я также ценю любые указатели на различия в рассоле/глубине между python2 и python3]