为什么Python的!=运算符会认为变量在同一时刻既相等又不相等?

15 投票
3 回答
5083 浏览
提问于 2025-04-16 11:38

来看这个例子:

>>> 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 个回答

2

你需要同时定义 __ne____eq__ 这两个东西。而且你可能还应该考虑实现 __cmp__

8

有一个单独的功能用来处理 != 这个符号,它叫做 __ne__,这个功能是自动定义的,用来比较对象里的成员。

你想要做的事情是:

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

或者你可以用这个的某种变体。

28

Python的“数据模型”里讲得很清楚:

比较运算符之间并没有隐含的关系。比如说,如果 x==y 是真的,并不意味着 x!=y 就一定是假的。因此,在定义 __eq__() 的时候,也应该定义 __ne__(),这样运算符的行为才会符合我们的预期。

C(1) != C(2) 这个例子中,它使用的是默认的实现方式,在这种情况下,对象只和自己相等,和其他任何东西都不相等。

定义 __cmp__ 会简单一些,因为它可以作为所有比较操作的备用方案,而不仅仅是某些操作:

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

撰写回答