【发布时间】:2011-09-15 16:06:52
【问题描述】:
如果我有对象a 和b 以及两个引用对象obj,当我腌制然后恢复对象时会发生什么?腌制数据会“知道”a 和 b 都引用了同一个对象并相应地恢复所有内容,还是两者会得到两个不同的——最初是相等的——对象?
【问题讨论】:
如果我有对象a 和b 以及两个引用对象obj,当我腌制然后恢复对象时会发生什么?腌制数据会“知道”a 和 b 都引用了同一个对象并相应地恢复所有内容,还是两者会得到两个不同的——最初是相等的——对象?
【问题讨论】:
是的,共享对象只会被序列化一次(pickle 协议甚至可以处理循环引用)。
pickle模块跟踪它已经拥有的对象 序列化,这样以后对同一个对象的引用就不会被 再次序列化。marshal不这样做。这对递归对象和对象共享都有影响。 递归对象是包含对自身的引用的对象。 这些不是由
marshal处理的,实际上是试图编组 递归对象会使你的 Python 解释器崩溃。对象共享 当有多个对同一对象的引用时发生 被序列化的对象层次结构中的不同位置。pickle此类对象仅存储一次,并确保所有其他引用 指向主副本。共享对象保持共享,可以 对于可变对象非常重要。
【讨论】:
正如@aix 指出的那样,pickle 理解对同一对象的多个引用,但只能在一次酸洗中。也就是说,pickle 总是腌制单个对象。如果该对象中有引用,则这些引用将在未腌制的对象中正确共享。
但是如果你调用 pickle 两次来腌制两个对象,对象之间的共享引用将无法正确保留。该对象现在将存在两次。
【讨论】: