为什么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 个回答
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