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 depickle
pero 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
ydeepcopy
y, 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]