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

时间:2012-03-02 08:30:50

标签: python pickle object-comparison

我认为这是预期的行为,但我想检查并找出原因,因为我所做的研究已经空白了

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

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

重新加载pickle文件

现在我做的时候:

print source_list == pickle_list

这总是回来False,我不知道为什么,如果我打印列表或看结构看起来完全一样。

任何想法都会很明显,这是我需要排序的最后一点。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

>>> class C(object):
...     def __init__(self, value):
...         self.value = value
...         
>>> 
>>> C(12) == C(12)
False

您希望在自定义类中定义__eq__()(和__ne__()),以便为包含相同数据的对象生成True。更多信息可以在official documentation中找到。对于上面的例子,这将是:

>>> 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