Python np.isnan()==False,但np.isnan()不是False

Python np.isnan()==False,但np.isnan()不是False,python,numpy,boolean,python-3.5,Python,Numpy,Boolean,Python 3.5,据我所知,=检查值的相等性,is检查值背后的结构标识(比如,在其他一些语言中,==) 鉴于此,我不理解以下内容: np.isnan(30) == False Out[19]: True np.isnan(30) is False Out[20]: False 其他身份检查似乎并非如此: (5 == 4) == False Out[22]: True (5 == 4) is False Out[23]: True 它看起来好像np.isnan()以值的形式返回False,而不是以标识的

据我所知,
=
检查值的相等性,
is
检查值背后的结构标识(比如,在其他一些语言中,
==

鉴于此,我不理解以下内容:

np.isnan(30) == False
Out[19]: 
True
np.isnan(30) is False
Out[20]: 
False
其他身份检查似乎并非如此:

(5 == 4) == False
Out[22]: 
True
(5 == 4) is False
Out[23]: 
True
它看起来好像
np.isnan()
以值的形式返回
False
,而不是以标识的形式返回。为什么会出现这种情况?

np.isnan(30)
返回
s
np.False\uuu
,它与
False
具有不同的标识;但不要依赖于此

>>> import numpy as np
>>> np.isnan(30) is np.False_
True
>>> np.False_ is False
False
>>> 
numpy.isnan()
返回兼容的类型对象:

>>> import numpy
>>> type(numpy.isnan(0))
<class 'numpy.bool_'>
其中,
dtype
也是Numpy布尔对象


Python不保证布尔操作必须始终返回单例布尔值。无论如何,您都不应该测试
是否为真
是否为假。在布尔运算中直接使用
numpy.isnan()
输出,使用
not
测试假值:

if numpy.isnan(foo):


您不应该首先测试
False
True
。如果是np.isnan(..)
则使用
,如果不是np.isnan(..)
则使用
。没有要求Python解释器只使用布尔值对象的一个副本,显然Numpy没有这样做。@MartijnPieters这似乎是一个风格注释(我很欣赏),但不是作为函数行为的答案?(也就是说,虽然我不应该做那个操作,但我应该能够做。否?)@FooBar这完全取决于实现,因此不,您不应该这样做。。。。或者更确切地说,这种行为直接证明了为什么你不应该这样做。结果证明这是一次令人着迷的尝试。我发现numpy还有一个
bool
函数,它与
builtins.bool
相同。擦伤头部。所以
numpy.bool\ucode>是numpy的bool,但是
numpy.bool
是Python的bool。@kojiro:那是。。可能是一个泄露的全球信息。所以说我们
\uuuuuuuuuuuuuuuuuuuu
@kojiro:。不知道为什么他们觉得有必要让这些人可以接近。可能是传统的支持,以前数据类型可以在这些名称下使用。事实上,遗产中没有任何解释。起初,
numpy.bool
是numpy标量类型,但在指出从numpy import*
执行
时会覆盖内置项后,它很快被重命名为
numpy.bool
(当时更常见)。但是到那时,已经有了使用
dtype=numpy.bool等的代码。因此名称仍然保留,就像对内置代码的重述一样。
if numpy.isnan(foo):
if not numpy.isnan(bar):