Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pickle可以处理多个对象引用吗_Python_Pickle - Fatal编程技术网

Python Pickle可以处理多个对象引用吗

Python Pickle可以处理多个对象引用吗,python,pickle,Python,Pickle,如果我有对象a和b以及两个引用对象obj,当我Pickle并恢复对象时会发生什么?经过pickle处理的数据是否会“知道”a和b都引用了同一个对象并相应地恢复所有内容,或者这两个对象是否会得到两个不同且初始相等的对象 是的,共享对象只能序列化一次(pickle协议甚至可以处理循环引用) 从: pickle模块跟踪它已经拥有的对象 序列化,这样以后对同一对象的引用就不会 再次序列化封送处理不执行此操作 这对递归对象和对象共享都有影响。 递归对象是包含对其自身的引用的对象。 这些都不是由封送处理的,

如果我有对象
a
b
以及两个引用对象
obj
,当我Pickle并恢复对象时会发生什么?经过pickle处理的数据是否会“知道”
a
b
都引用了同一个对象并相应地恢复所有内容,或者这两个对象是否会得到两个不同且初始相等的对象

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

从:

pickle
模块跟踪它已经拥有的对象 序列化,这样以后对同一对象的引用就不会 再次序列化<代码>封送处理不执行此操作

这对递归对象和对象共享都有影响。 递归对象是包含对其自身的引用的对象。 这些都不是由
封送处理的,实际上是试图封送处理的
递归对象将使Python解释器崩溃。对象共享
在中存在对同一对象的多个引用时发生
正在序列化的对象层次结构中的不同位置<代码>pickle
仅存储此类对象一次,并确保所有其他引用 指向母版。共享对象保持共享,这可以 对于可变对象非常重要


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

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