如果我有对象a
和b
以及两个引用对象obj
,那么当我Pickle然后恢复对象时会发生什么?腌制数据是否“知道”a
和b
都引用相同的对象并相应地恢复所有内容,或者两者会得到两个不同的 - 最初是相等的 - 对象?
答案 0 :(得分:8)
是的,共享对象只会序列化一次(pickle协议甚至可以处理循环引用)。
pickle
模块会跟踪它已经存在的对象 序列化,以便以后引用同一个对象不会 再次序列化。marshal
不会这样做。这对递归对象和对象共享都有影响。 递归对象是包含对自身的引用的对象。 这些不是由
marshal
处理的,实际上是试图编组 递归对象会使Python解释器崩溃。对象共享 当有多个对同一对象的引用时发生 要序列化的对象层次结构中的不同位置。pickle
仅存储此类对象一次,并确保所有其他引用 指向主副本。共享对象保持共享,即可 对于可变对象非常重要。
答案 1 :(得分:7)
正如@aix指出的那样,pickle
理解对同一对象的多个引用,但仅限于一次酸洗。也就是说,泡菜总是腌制一个物体。如果该对象中包含引用,那么这些引用将在unpickled对象中正确共享。
但是如果你两次调用pickle来挑选两个对象,那么对象之间的共享引用将无法正确保存。该对象现在将存在两次。