Python pickle:pickle对象不等于源对象
我认为这是预期的行为,但我想检查一下,也许能找出原因,因为我所做的研究是空白的 我有一个函数,可以提取数据,创建自定义类的新实例,然后将其附加到列表中。该类只包含变量 然后,我使用协议2作为二进制文件将该列表pickle到一个文件中,然后我重新运行脚本,从源代码中重新提取数据,我有一个带有自定义类实例的新列表,用于测试,我保持数据与源数据相同 重新加载pickle文件 现在当我做一个Python pickle:pickle对象不等于源对象,python,pickle,object-comparison,Python,Pickle,Object Comparison,我认为这是预期的行为,但我想检查一下,也许能找出原因,因为我所做的研究是空白的 我有一个函数,可以提取数据,创建自定义类的新实例,然后将其附加到列表中。该类只包含变量 然后,我使用协议2作为二进制文件将该列表pickle到一个文件中,然后我重新运行脚本,从源代码中重新提取数据,我有一个带有自定义类实例的新列表,用于测试,我保持数据与源数据相同 重新加载pickle文件 现在当我做一个 print source_list == pickle_list 这总是会出现False,我不知道为什么,如果
print source_list == pickle_list
这总是会出现False
,我不知道为什么,如果我打印列表或查看结构,它们看起来完全一样
任何想法都是错误的,这是我需要排序的最后一点。比较同一类的两个对象默认为错误(除非它们是相同的单个对象),即使它们具有相同的内容;换句话说,默认情况下,来自同一类的两个直观上“相同”的对象被认为是不同的。以下是一个例子:
>>> class C(object):
... def __init__(self, value):
... self.value = value
...
>>>
>>> C(12) == C(12)
False
您希望在自定义类中定义\uuuu eq\uuuu()
(和\uu ne\uuuuu()
)以便为包含相同数据的对象生成True。有关更多信息,请参阅。对于上述示例,这将是:
>>> 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
您的类可能没有定义有意义的
\uuuuuueq\uuuu
,因此正在比较对象标识。由于从pickle加载的类与生成的列表中的类不是相同的对象(即使它们具有相同的数据),因此您得到的False
定义\uuuuueq\uuu()
是不够的。还需要定义\uu ne\uu()
:如果类C
只定义\uu eq\uu()
,那么C(12)!=C(12)
是正确的,这不是原始海报想要的。您好,谢谢您的示例,我错过了ne部分。好榜样