为啥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 所以只返回 True
或 False
的要求不是强加
【参考方案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中有不相等的运算符[重复]的主要内容,如果未能解决你的问题,请参考以下文章