Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pickle:pickle对象不等于源对象_Python_Pickle_Object Comparison - Fatal编程技术网

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

Python pickle:pickle对象不等于源对象,python,pickle,object-comparison,Python,Pickle,Object Comparison,我认为这是预期的行为,但我想检查一下,也许能找出原因,因为我所做的研究是空白的 我有一个函数,可以提取数据,创建自定义类的新实例,然后将其附加到列表中。该类只包含变量 然后,我使用协议2作为二进制文件将该列表pickle到一个文件中,然后我重新运行脚本,从源代码中重新提取数据,我有一个带有自定义类实例的新列表,用于测试,我保持数据与源数据相同 重新加载pickle文件 现在当我做一个 print source_list == pickle_list 这总是会出现False,我不知道为什么,如果

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

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

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

重新加载pickle文件

现在当我做一个

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部分。好榜样