提问人:Mr Korni 提问时间:7/20/2018 最后编辑:Mr Korni 更新时间:7/20/2018 访问量:421
“not ==”和“!=”有什么区别?
What is the difference between "not ==" and "!="?
问:
我正在看谷歌,但我找不到答案。
if 5 != 10:
print('True')
# True
if not 5 == 10:
print('True')
# True
两者似乎都是一样的。何时使用“not ==”,何时使用“!=”?
答:
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__
not
not
!=
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__
not
if not 10
if not bool(10)
if 10
if bool(10)
-2赞
Antony Waiganjo
7/20/2018
#3
正如您在结果中看到的那样,两者的含义相同,检查一个值是否与另一个值不同,这是一个偏好问题......
评论
!=
not
a != b
not (a == b)
True
not False