为啥python中有不相等的运算符[重复]

Posted

技术标签:

【中文标题】为啥python中有不相等的运算符[重复]【英文标题】:Why is there a not equal operator in python [duplicate]为什么python中有不相等的运算符[重复] 【发布时间】:2015-08-27 13:00:44 【问题描述】:

我想知道python 中有一个不等于运算符的原因。

以下截图:

class Foo:
    def __eq__(self, other):
        print('Equal called')
        return True

    def __ne__(self, other):
        print('Not equal called')
        return True

if __name__ == '__main__':
    a = Foo()

    print(a == 1)
    print(a != 1)
    print(not a == 1)

输出:

Equal called
True
Not equal called
True
Equal called
False

这是否真的会通过可能的说法引起很多麻烦:

A == B and A != B

可以同时正确。此外,这会在忘记实现 __ne__ 时引入潜在的陷阱。

【问题讨论】:

优化?这是违反合同的。 "比较运算符之间不存在隐含关系。x==y 为真并不意味着x!=y 为假。因此,在定义__eq__() 时,还应定义__ne__() 以便操作员按预期行事。" @CoryKramer 它来自哪里? 这似乎符合 Python 的非正式“我们都是成年人”的政策。如果您想通过两个运算符的不一致行为来自取其辱,那么 Python 不会阻止您。 (我知道这并不能真正回答“为什么首先有两种不同的 dunder 方法?”的问题,但值得指出) @magu_ 无论哪种方式,我都可以看到一个强有力的论据,但我认为他们的决定是 Python 应该允许 many-valued logic 所以只返回 TrueFalse 的要求不是强加 【参考方案1】:

根据自己的需要,有时相等和不相等并不相反;但是,绝大多数情况下它们是相反的,所以在 Python 3 中,如果你没有指定 __ne__ 方法,Python 会为你反转 __eq__ 方法。

如果您要编写同时在 Python 2 和 Python 3 上运行的代码,那么您应该同时定义两者。

【讨论】:

NaN 也是我的第一个想法,但我只是对其进行了测试,我想不出两个比较不会返回相反结果的情况。 嗯,我不同意。如果 NaN 等于任意数量的非,它应该由库定义。我同意第二点,除非子类化它仍然是一个潜在的陷阱。 @MarkRansom:啊,好的,谢谢。修正了这一点。 @magu_:我删除了关于NaN 的观点,因为我错了,但在Python 中NaN 不等于一切,包括它自己。对于一个库做其他事情,它必须创建它自己的NaN-like 对象并使用它。 “显式优于隐式。”【参考方案2】:

根据data model documentation,它涵盖了您可以在类上实现的“魔法方法”(强调我的):

比较运算符之间没有隐含的关系。 x==y 的真实性并不意味着 x!=y 是虚假的。 因此,当 定义__eq__(),还应该定义__ne__(),这样 运算符将按预期运行。

【讨论】:

我很想看到一个实际的例子,让 __eq____ne__ 行为不一致很有用。 @MarkRansom numpy 怎么样,数组上的==!= 创建布尔元素比较的数组? x != y 给出一个数组,not x == y 给出一个 ValueError!【参考方案3】:

您似乎返回 True 而不是进行比较。

【讨论】:

他的代码 sn-p 实际上并没有问题。他在问为什么语言是这样设计的。 他们故意这样做是为了证明一个观点。 Python允许你提交逻辑矛盾 我认为这是故意的。 我不是在问代码为什么会这样,它是怎么做的,而是为什么这甚至是可能的。

以上是关于为啥python中有不相等的运算符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥赋值运算符和相等运算符之间没有 1:1 的关系?

为啥结构和可变结构具有不同的默认相等运算符?

Python is同一性运算符和==相等运算符区别

为啥相等运算符适用于整数值,直到 128 数字? [复制]

为啥 Swift 的大于或小于运算符不能比较可选项,而相等运算符可以呢?

python运算符