pickle和deepcopy之间的关系

8 浏览
0 Comments

pickle和deepcopy之间的关系

picklecopy.deepcopy之间的关系是什么?它们分享了哪些机制,以及如何分享的?

很明显,这两个操作是密切相关的,并且分享了一些机制/协议,但是我搞不清楚具体细节。

我发现了一些混乱的事情:

  1. 如果一个类定义了__[gs]etstate__,它们在对其实例进行deepcopy时会被调用。这一点一开始让我感到惊讶,因为我以为它们是特定于pickle的,但后来我发现类可以使用相同的接口来控制复制,就像它们用来控制pickling一样。然而,没有关于深度复制时如何使用__[gs]etstate__的文档(如何使用__getstate__返回的值,传给__setstate__的是什么?)
  2. 一个天真的deepcopy的替代实现将是pickle.loads(pickle.dumps(obj))。然而,这显然不能等同于深度复制,因为如果一个类定义了一个__deepcopy__操作,它不会在使用基于pickle的深度复制实现时被调用。(我还偶然发现深度复制比pickle更通用,并且有许多类型是可深度复制的,但不可pickle的。)

(1)表示了共同点,而(2)表示了pickledeepcopy之间的差异。

除此之外,我还发现了这两个相互矛盾的说法:

copy_reg:pickle、cPickle和copy模块在对这些对象进行pickling/copying时使用这些函数。

copy模块不使用copy_reg注册模块。

一方面,这是pickledeepcopy之间关系/共同点的另一个指示,另一方面,它增加了我的困惑......

[我使用的是python2.7,但我也希望得到关于python2和python3之间pickle/deepcopy差异的指引]

0