2011-09-15 10 views
7

Si tengo los objetos a y b y ambos objetos de referencia obj, ¿qué sucede cuando salmuera y luego restauro los objetos? ¿Los datos en escabeche 'sabrán' que a y b hicieron referencia al mismo objeto y restauraron todo en consecuencia, o los dos obtendrán dos objetos diferentes — e inicialmente iguales —?Puede salmuera manejar múltiples referencias de objetos

Respuesta

7

Sí, los objetos compartidos solo se serializarán una vez (el protocolo pickle puede incluso manejar referencias circulares).

Desde el documentation:

El módulo pickle realiza un seguimiento de los objetos que ya ha en serie, por lo que las referencias posteriores al mismo objeto no serán serializados de nuevo. marshal no hace esto.

Esto tiene implicaciones tanto para objetos recursivos como para compartir objetos. Los objetos recursivos son objetos que contienen referencias a ellos mismos. Estos no son manejados por marshal, y de hecho, al tratar de ordenar objetos recursivos se bloqueará su intérprete de Python. El intercambio de objetos ocurre cuando hay varias referencias al mismo objeto en lugares diferentes en la jerarquía de objetos que se serializa. pickle almacena dichos objetos solo una vez y garantiza que todas las otras referencias apuntan a la copia maestra. Los objetos compartidos permanecen compartidos, lo que puede ser muy importante para objetos mutables.

+0

Eso es genial. :RE –

7

Como señala @aix, pickle comprende múltiples referencias al mismo objeto, pero solo dentro de un único decapado. Es decir, pickle siempre encurtirá un solo objeto. Si ese objeto tiene referencias dentro de él, esas referencias se compartirán correctamente en el objeto sin descodificar.

Pero si llama a Pickle dos veces, para extraer dos objetos, las referencias compartidas entre los objetos no se conservarán correctamente. El objeto ahora existirá dos veces.

Cuestiones relacionadas