可以Pickle处理多个对象引用

Pau*_*nta 12 python pickle

如果我有对象ab两个引用对象obj,当我Pickle然后恢复对象时会发生什么?腌制数据是否"知道" a并且b都引用相同的对象并相应地恢复所有内容,或者两者会得到两个不同的 - 最初是相等的 - 对象?

NPE*_*NPE 12

是的,共享对象只会序列化一次(pickle协议甚至可以处理循环引用).

文档:

pickle模块会跟踪它已经序列化的对象,以便以后对同一对象的引用不会再次序列化.marshal不这样做.

这对递归对象和对象共享都有影响.递归对象是包含对自身的引用的对象.这些都不会被处理marshal,事实上,尝试编组递归对象会使Python解释器崩溃.当序列化的对象层次结构中的不同位置有多个对同一对象的引用时,就会发生对象共享.pickle 仅存储此类对象一次,并确保所有其他引用指向主副本.共享对象保持共享,这对于可变对象非常重要.


Ned*_*der 9

正如@aix指出的那样,pickle理解对同一对象的多个引用,但仅限于一次酸洗.也就是说,泡菜总是腌制一个物体.如果该对象中包含引用,那么这些引用将在unpickled对象中正确共享.

但是如果你两次调用pickle来挑选两个对象,那么对象之间的共享引用将无法正确保存.该对象现在将存在两次.