Python泡菜不是一对一的:不同的泡菜给出相同的对象

时间:2014-01-21 23:50:57

标签: python serialization pickle

有人可以解释一下吗?

pickle.loads(b'\x80\x03X\x01\x00\x00\x00.q\x00h\x00\x86q\x01.') == pickle.loads(b'\x80\x03X\x01\x00\x00\x00.q\x00X\x01\x00\x00\x00.q\x01\x86q\x02.')
>>>True

pickle.loads(b'\x80\x03X\x01\x00\x00\x00.q\x00h\x00\x86q\x01.')
>>>('.', '.')
pickle.loads(b'\x80\x03X\x01\x00\x00\x00.q\x00X\x01\x00\x00\x00.q\x01\x86q\x02.')
>>>('.', '.')

似乎有一个长而短的腌制版本的元组重复使用相同的元素。

其他例子:

pickle.loads(b'\x80\x03X\x01\x00\x00\x00#q\x00X\x01\x00\x00\x00#q\x01\x86q\x02.')
>>>('#', '#')
pickle.loads(b'\x80\x03X\x01\x00\x00\x00#q\x00h\x00\x86q\x01.')
>>>('#', '#')

pickle.loads(b'\x80\x03X\x01\x00\x00\x00$q\x00X\x01\x00\x00\x00$q\x01\x86q\x02.')
>>>('$', '$')
pickle.loads(b'\x80\x03X\x01\x00\x00\x00$q\x00h\x00\x86q\x01.')
>>>('$', '$')

我试图通过他们的泡菜来索引物品,但我找不到这些物品,因为他们的泡菜似乎正在改变。

我在Ubuntu上使用Python 3.3.2。

1 个答案:

答案 0 :(得分:4)

酱菜不是唯一的; pickle格式实际上是tiny little programming language,不同的程序(pickle)可以产生相同的输出(unpickled对象)。来自文档:

  

由于pickle数据格式实际上是一种很小的面向堆栈的编程语言,并且在某些对象的编码中有一些自由,因此两个模块[pickle和cPickle]可能为相同的输入生成不同的数据流对象。但是,保证它们始终能够读取彼此的数据流。

甚至还有一个pickletools.optimize功能,它会产生泡菜并输出更好的泡菜。你需要重新设计你的程序。