2012-03-02 62 views
1

我认为这是正常现象,但要检查,也许找出原因,因为我已经做了研究已经拿出空白Python的泡菜:酸菜对象不等于源对象

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

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

刷新咸菜文件

现在,当我做:

print source_list == pickle_list 

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

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

回答

1

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

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

你想在你的自定义类来定义__eq__()(和__ne__()),使其产生真正的为包含相同的数据对象。更多信息可在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 
+0

你好,谢谢你的例子,我错过了__ne__部分。很好的例子 – Richard 2012-03-02 14:06:45

3

你的类可能没有定义有意义__eq__,因而正在为对象身份比较。由于从菜单加载的类与生成列表中的类不同(即使它们具有相同的数据),您将获得False

+0

定义'__eq __()'是不够的。有必要定义'__ne __()':如果一个类'C'只定义了__eq __()',那么'C(12)!= C(12)'为真,这不是原始海报想。 – EOL 2012-03-02 13:30:35

+0

感谢您的回应,这是一种享受 – Richard 2012-03-02 14:06:07