Python 2.7.8 - 在取消排列结构时保留树中的根父子关系

时间:2014-09-24 16:09:56

标签: python serialization tree pickle

我有一个树形数据结构,我希望能够挑选和解开。

问题在于,当unpickling时,指向root的所有子节点作为其父节点似乎存储对与实际根节点不同的地址的引用。

实际的根和这个虚假的' root似乎具有完全相同的属性并指向完全相同的子节点,但是当自下而上跟随父关系时,我显然会到达不正确的根节点。

我已经创建了一个可编译的示例here(对代码的长度表示道歉,但我认为这是最短的我可以用来说明问题)。

如果你想象一个像这样的结构:

0
 - 1
 - 2
   - 3
     - 4

这是我在取消打印之前打印上述节点的父子关系后的输出:

Node: 0 <__main__.Node instance at 0x2b112094acb0> 
Node: 1 <__main__.Node instance at 0x2b112094ac68> Parent: 0 <__main__.Node instance at 0x2b112094acb0>
Node: 2 <__main__.Node instance at 0x2b112093a680> Parent: 0 <__main__.Node instance at 0x2b112094acb0>
Node: 3 <__main__.Node instance at 0x2b112093a710> Parent: 2 <__main__.Node instance at 0x2b112093a680>
Node: 4 <__main__.Node instance at 0x2b112093a758> Parent: 3 <__main__.Node instance at 0x2b112093a710>

请注意节点0如何匹配节点12指向其父节点(0x2b112094acb0)的地址。

然而,在我取消数据之后:

Node: 0 <__main__.Node instance at 0x2b4fefd3e7a0> 
Node: 1 <__main__.Node instance at 0x2b4fefd30ab8> Parent: 0 <__main__.Node instance at 0x2b4fefd30ef0>
Node: 2 <__main__.Node instance at 0x2b4fefd30ea8> Parent: 0 <__main__.Node instance at 0x2b4fefd30ef0>
Node: 3 <__main__.Node instance at 0x2b4fefd30a28> Parent: 2 <__main__.Node instance at 0x2b4fefd30ea8>
Node: 4 <__main__.Node instance at 0x2b4fefd307a0> Parent: 3 <__main__.Node instance at 0x2b4fefd30a28>

现在,节点0指向一个地址(0x2b4fefd3e7a0),节点12的父级指向一个完全不同的地址,但仍然是一个节点{{1 (0)。

有没有办法在0x2b4fefd30ef0中更正此问题,而无需手动浏览根目录的所有子节点并为其分配正确的父地址?

目前我手动修复此问题,但是想知道这是否是pickle和递归结构的常见问题,以及是否有解决它的条款。

0 个答案:

没有答案