可以Pickle处理多个对象引用

时间:2011-09-15 16:06:52

标签: python pickle

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

2 个答案:

答案 0 :(得分:8)

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

来自documentation

  

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

     

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

答案 1 :(得分:7)

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

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