“not ==”和“!=”有什么区别?

What is the difference between "not ==" and "!="?

提问人:Mr Korni 提问时间:7/20/2018 最后编辑:Mr Korni 更新时间:7/20/2018 访问量:421

问:

我正在看谷歌,但我找不到答案。

if 5 != 10:
    print('True')

# True

if not 5 == 10:
    print('True')

# True

两者似乎都是一样的。何时使用“not ==”,何时使用“!=”?

python-3.x 运算符 相等

评论

0赞 that other guy 7/20/2018
它们完全不相似:是二元运算符,是一元运算符。相似之处是 vs .这个问题类似于“你什么时候使用,什么时候使用?!=nota != bnot (a == b)Truenot False

答:

3赞 wim 7/20/2018 #1

在与两个整数进行比较的情况下,它们是相同的。更喜欢更多的pythonic。!=

如果任一操作数是自定义类的实例,则结果可能会有所不同。自定义类可以自由覆盖和独立操作(即使结果很疯狂)==!=

来自 LHS:

>>> class A:
...     def __eq__(self, other):
...         return False
...     def __ne__(self, other):
...         return False
...     
>>> a = A()
>>> a != 5
False
>>> not a == 5
True

从 RHS:

>>> class R(str):
...     def __eq__(self, other):
...         return False
...     def __ne__(self, other):
...         return False
...     
>>> r = R()
>>> 'spam' != r
False
>>> not 'spam' == r
True
4赞 MSeifert 7/20/2018 #2

这些语句是等效的,只要返回 的逻辑逆函数。对于大多数数据类型,这是一个有效的假设,但是 Python 允许实现 and 特别是 (__eq__ for 和 __ne__ for )。因此,这实际上取决于您使用的数据类型。==!===!===!=

甚至可能不返回布尔值,它们甚至不必返回相同的数据类型。这为自定义结果提供了另一种可能性:通过真值测试,可以通过 __bool__(或在 Python 2 中)方法自定义(除了其他方法)。==!=__nonzero

但是,对于整数,这两种方法都是等价的。但是,我总是会使用这种方法。意图更清晰,更短。!=

举个例子,说明语句不等效,让我们采用一种数据类型,例如 NumPy 数组(只是为了命名一种流行的数据结构,它以不同的方式实现运算符),它实现并返回另一个包含布尔值的 NumPy 数组,并且还实现抛出 Exception:==!=__bool__

>>> import numpy as np
>>> np.array([1,2,3]) != np.array([3,3,3])
array([ True,  True, False])

>>> not np.array([1,2,3]) == np.array([3,3,3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

但是,如果您在两者中使用其中任何一个都会引发异常。if

评论

0赞 Gil Hamilton 7/20/2018
__bool__用于转换为布尔值,然后可以通过 对布尔值的结果进行逻辑否定。 实际上并没有实现。not__bool__not
0赞 MSeifert 7/20/2018
@GilHamilton Well 是实现实例真值的最直接方式。我的意思是是的,从技术上讲,您也可以通过以下方式实现它,但这可能完全超出了问题范围。我可能应该说“检查”真值“,这可以通过”实现。 :)__bool____len__not__bool__
0赞 Gil Hamilton 7/20/2018
我仍然认为你的答案混淆了两件不同的事情:实现真值确定。 只是否定现有的布尔值。因此,在对象上没有特殊的方法来“实现”——而有这样一种特殊的方法__bool__notnot!=
0赞 MSeifert 7/20/2018
@GilHamilton 好的,现在我有点困惑:将显式调用(如果已实现),它不需要布尔值。这就是为什么你可以使用之类的。另一方面,也可以通过if is not来实现。如果我们深入研究所有细节,就会变得非常复杂。长话短说:我认为这是一个很好的“经验法则”,可以用来实施真值测试,包括(即使它不是 100% 正确 - 但它可能是 99% 正确)。not__bool__not 10!=__eq____ne____bool__not
0赞 Gil Hamilton 7/20/2018
转换为布尔值是导致调用的原因,它首先发生(在计算之前)。换句话说,之所以有效,是因为它等价于 -- 只是布尔转换在前者中是隐式的。但您也可以执行隐式转换为 .__bool__notif not 10if not bool(10)if 10if bool(10)
-2赞 Antony Waiganjo 7/20/2018 #3

正如您在结果中看到的那样,两者的含义相同,检查一个值是否与另一个值不同,这是一个偏好问题......