两者之间是否有显着差异:如果不是a =='bar',如果是!='bar'?

时间:2011-12-15 02:34:57

标签: python

这只是编写相同代码的两种方法吗?我应该注意哪些功能上的差异?

>>> a = 'foo'
>>> if not a == 'bar':
...     'its not'
... 
'its not'
>>> if a != 'bar':
...     'its not'
... 
'its not'

2 个答案:

答案 0 :(得分:6)

在python中,要检查对象是否等于另一个对象,可以调用特殊函数。调用__eq__来检查==,同时调用__ne__来检查!=

通常,对象可以与__ne__不同地定义__eq__

E.g。

class Junk(object):
    def __ne__(self, other):
        return False

    def __eq__(self, other):
        return False

j = Junk()
print not j == 1
print j != 1

这会产生:

True
False

然而,这将是特别邪恶的......你通常不应该担心这一点。

答案 1 :(得分:1)

not a == b被转换为对not a.__eq__(b)的调用,而a != b被转换为对a.__ne__(b)的调用。在大多数情况下(我能想到的几乎每个普通对象),__ne__被定义为def __ne__(self, other): not self.__eq__(other),因此没有功能差异。但是,您可以轻松创建一个既相同又不等于其他值的精神病对象,只需以正确的方式覆盖__ne__(尽管我无法想到现在有意义的情况)

另一方面,内置对象可能以比a != b稍快的方式实现not a == b,但可能没有任何明显的数量。