В чем именно заключается связь между 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]