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

2024-04-23

有人可以解释一下吗?

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。


泡菜并不是独一无二的。 pickle 格式实际上是微小的编程语言 http://docs.python.org/2/library/pickle.html#id20,并且不同的程序(pickles)可以产生相同的输出(unpickled 对象)。来自文档:

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

甚至还有一个pickletools.optimize http://docs.python.org/2/library/pickletools.html函数将接受 pickle 并输出更好的 pickle。您将需要重新设计您的程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python pickle 不是一对一的:不同的 pickle 给出相同的对象 的相关文章

随机推荐