在python 2.7中,“x!= y”和“not x == y”之间的区别是什么?

时间:2013-10-11 07:50:44

标签: python python-2.7

这可能非常基本但是:

作为同一个类的XY个对象,调用not x == y会导致我的调试器在类__eq__方法中停止,但调用x != y则不会?

!=检查什么?它等同于is not(参考检查)吗?

2 个答案:

答案 0 :(得分:8)

!=运算符调用__ne__特殊方法。定义__eq__的类还应定义执行反向的__ne__方法。

提供__eq____ne____hash__的典型模式如下所示:

class SomeClass(object):
    # ...
    def __eq__(self, other):
        if not isinstance(other, SomeClass):
            return NotImplemented
        return self.attr1 == other.attr1 and self.attr2 == other.attr2

    def __ne__(self, other):
        return not (self == other)

    # if __hash__ is not needed, write __hash__ = None and it will be
    # automatically disabled
    def __hash__(self):
        return hash((self.attr1, self.attr2))

答案 1 :(得分:5)

从此页面引用http://docs.python.org/2/reference/datamodel.html#object.ne

  

比较运营商之间没有隐含的关系。该   x==y的真相并不意味着x!=y是假的。因此,何时   定义__eq__(),还应定义__ne__()以便{。}}   运营商将按预期行事。请参阅__hash__()上的段落   关于创建支持自定义的可散列对象的一些重要说明   比较操作,可用作字典键。