【问题标题】:Can Pickle handle multiple object referencesPickle 可以处理多个对象引用吗
【发布时间】:2011-09-15 16:06:52
【问题描述】:

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

【问题讨论】:

    标签: python pickle


    【解决方案1】:

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

    来自documentation:

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

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

    【讨论】:

      【解决方案2】:

      正如@aix 指出的那样,pickle 理解对同一对象的多个引用,但只能在一次酸洗中。也就是说,pickle 总是腌制单个对象。如果该对象中有引用,则这些引用将在未腌制的对象中正确共享。

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

      【讨论】:

        猜你喜欢
        • 2015-10-06
        • 2012-09-18
        • 2013-03-01
        • 2014-08-06
        • 2011-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多