3

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

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

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

重新加载泡菜文件

现在当我做一个:

print source_list == pickle_list

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

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

4

2 回答 2

5

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

于 2012-03-02T08:35:28.543 回答
2

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

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

您想在自定义类中定义__eq__()(and __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
于 2012-03-02T08:35:16.663 回答