有人可以解释一下吗?
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。
答案 0 :(得分:4)
酱菜不是唯一的; pickle格式实际上是tiny little programming language,不同的程序(pickle)可以产生相同的输出(unpickled对象)。来自文档:
由于pickle数据格式实际上是一种很小的面向堆栈的编程语言,并且在某些对象的编码中有一些自由,因此两个模块[pickle和cPickle]可能为相同的输入生成不同的数据流对象。但是,保证它们始终能够读取彼此的数据流。
甚至还有一个pickletools.optimize
功能,它会产生泡菜并输出更好的泡菜。你需要重新设计你的程序。