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

Emi*_*nov 14 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?!?
Run Code Online (Sandbox Code Playgroud)

所以现在这两个对象是相同的,并且不是同等的.我虽然这两个行动是对立的?!

Jos*_*Lee 27

Python的"数据模型"解释了这一切:

比较运算符之间没有隐含的关系.事实x==y并非暗示这x!=y是错误的.因此,在定义时__eq__(),还应该定义__ne__()操作符将按预期运行.

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

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

...   def __cmp__(self, o):
...     return 0
>>> C(1) != C(2)
False
Run Code Online (Sandbox Code Playgroud)


mil*_*man 8

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

你想要做的是:

def __ne__(self, other):
    return not self.__eq__(other)
Run Code Online (Sandbox Code Playgroud)

或者这个的一些变体.