¿Puede Pickle manejar múltiples referencias de objetos?

Si tengo los objetos a y b y ambos hacen referencia al objeto obj , ¿qué sucede cuando decapo y luego restauro los objetos? ¿Sabrán los datos encurtidos que b hicieron referencia al mismo objeto y restaurarán todo en consecuencia, o los dos obtendrán dos objetos diferentes, e inicialmente iguales?

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

De la documentación :

El módulo pickle realiza un seguimiento de los objetos que ya ha serializado, por lo que las referencias posteriores al mismo objeto no se volverán a serializar. marshal no hace esto.

Esto tiene implicaciones tanto para los objetos recursivos como para compartir objetos. Los objetos recursivos son objetos que contienen referencias a sí mismos. Estos no son manejados por marshal , y de hecho, intentar calcular objetos recursivos colapsará su intérprete de Python. La compartición de objetos ocurre cuando hay varias referencias al mismo objeto en diferentes lugares en la jerarquía de objetos que se serializa. pickle almacena dichos objetos solo una vez y garantiza que todas las demás referencias apuntan a la copia maestra. Los objetos compartidos permanecen compartidos, lo que puede ser muy importante para los objetos mutables.

Como @aix señala, pickle entiende múltiples referencias al mismo objeto, pero solo dentro de un solo pickling. Es decir, los encurtidos siempre encurten un solo objeto. Si ese objeto tiene referencias dentro de él, esas referencias se compartirán correctamente en el objeto no seleccionado.

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