Python pickle:腌制对象不等于源对象

Ric*_*ard 5 python pickle object-comparison

我认为这是预期的行为,但想检查一下,也许找出原因,因为我所做的研究结果是空白

我有一个函数可以提取数据,创建自定义类的新实例,然后将其附加到列表中。该类仅包含变量。

然后,我使用协议 2 作为二进制文件将该列表腌制到文件中,稍后我重新运行脚本,从源中重新提取数据,我有一个包含自定义类实例的新列表,为了测试,我将数据保留为源数据相同。

重新加载pickle文件

现在当我做一个:

print source_list == pickle_list
Run Code Online (Sandbox Code Playgroud)

这总是会回来False,我不知道为什么,如果我打印列表或查看结构,它们看起来完全相同。

任何想法都会很棒,这是我需要整理的最后一点。

Amb*_*ber 6

您的类可能没有定义有意义的__eq__,因此正在比较对象标识。由于从 pickles 加载的类与生成的列表中的对象不同(即使它们具有相同的数据),因此您会得到False.


Eri*_*got 2

比较同一类的两个对象默认会产生 False(除非它们是相同的单个对象),即使它们具有相同的内容;换句话说,默认情况下,来自同一类的两个直观上“相同”的对象被认为是不同的。这是一个例子:

>>> class C(object):
...     def __init__(self, value):
...         self.value = value
...         
>>> 
>>> C(12) == C(12)
False
Run Code Online (Sandbox Code Playgroud)

您想要在自定义类中定义__eq__()( 和__ne__()),以便它对于包含相同数据的对象产生 True(分别为 False)。更多信息可以在官方文档中找到。对于上面的例子,这将是:

>>> class C(object):
...     # ...
...     def __eq__(self, other):
...         return self.value == other.value
...     def __ne__(self, other):
...         return not self == other  # More general than self.value != other.value
...     
>>> C(12) == C(12)  # __eq__() is called
True
>>> C(12) != C(12)  # __ne__() is called
False
Run Code Online (Sandbox Code Playgroud)