为什么Python的!=运算符认为参数是相等的而不是同时相等?

时间:2011-02-11 13:38:35

标签: python

采用以下示例:

>>> class C(object):
...     def __init__(self, p):
...         self.p = p
...     def __eq__(self, o):
...         return True
... 
>>> C(1) is C(2)
False
>>> C(1) == C(2)
True
>>> C(1) != C(2)
True # <- Why?!?

所以现在两个对象同时相等而不相等。我虽然这两个行动是对立的?!

3 个答案:

答案 0 :(得分:27)

Python的“Data model”解释了这一切:

  

比较运营商之间没有隐含的关系。 x==y的真相并不意味着x!=y是错误的。因此,在定义__eq__()时,还应定义__ne__(),以便运算符按预期运行。

C(1) != C(2)中,它使用默认实现,其中对象仅与自身相等,并且与其他所有内容不相等。

定义__cmp__可以更简单,因为它被用作所有比较操作的后备,而不仅仅是其中一些:

...   def __cmp__(self, o):
...     return 0
>>> C(1) != C(2)
False

答案 1 :(得分:8)

!=有一个单独的函数__ne__,它被隐式定义以比较实例成员。

您想要做的是:

def __ne__(self, other):
    return not self.__eq__(other)

或其中的一些变体。

答案 2 :(得分:2)

您必须同时定义__ne____eq__。你可能也应该考虑实施__cmp__