Relación entre el encurtido y la copia profunda

¿Cuál es exactamente la relación entrepickle ycopy.deepcopy? ¿Qué mecanismos comparten y cómo?

Está claro que las dos son operaciones estrechamente relacionadas y comparten algunos de los mecanismos / protocolos, pero no puedo entender los detalles.

Algunas cosas (confusas) que descubrí:

Si una clase define__[gs]etstate__, son llamados a undeepcopy de sus instancias. Esto me sorprendió al principio, porque pensé que eran específicos depicklepero luego encontré queLas clases pueden usar las mismas interfaces para controlar la copia que usan para controlar el decapado. Sin embargo, no hay documentación decómo __[gs]etstate__ se usa cuando se realiza una copia profunda (cómo se devuelve el valor de__getstate__ se utiliza, lo que se pasa a__setstate__?)Una implementación alternativa ingenua dedeepcopy seríapickle.loads(pickle.dumps(obj)). Sin embargo, esto no puede ser equivalente a la copia profunda, porque si una clase define un__deepcopy__ operación, no se invocaría utilizando esta implementación basada en pickle de deepcopy. (También me topé con una afirmación de que la copia profunda es más general que el encurtido, y hay muchos tipos que se pueden copiar en profundidad, pero no se pueden recoger).

(1) indica una comunidad, mientras que (2) indica una diferencia entrepickle ydeepcopy.

Además de eso, encontré estas dos declaraciones contradictorias:

copy_reg: Los módulos pickle, cPickle y copy usan esas funciones al decapar / copiar esos objetos

y

losCopiar El módulo no utiliza el módulo de registro copy_reg

Esto, por un lado, es otra indicación de una relación / comunidad entrepickle ydeepcopyy, por otro lado, contribuye a mi confusión ...

[Mi experiencia es con python2.7, pero también agradecería cualquier indicador sobre las diferencias en pickle / deepcopy entre python2 y python3]

Respuestas a la pregunta(2)

Su respuesta a la pregunta