Python 奇怪的布尔行为:包含多个元素的数组的真值不明确

Python 奇怪的布尔行为:包含多个元素的数组的真值不明确,python,python-3.x,numpy,Python,Python 3.x,Numpy,我对以下观察的行为感到困惑 >>> t = numpy.array([1,2,3]) >>> type(t) <class 'numpy.ndarray'> >>> type(t) != numpy.ndarray False >>> type(t) == numpy.ndarray True >>> type(t) != numpy.ndarray or t == None array([Fa

我对以下观察的行为感到困惑

>>> t = numpy.array([1,2,3])
>>> type(t)
<class 'numpy.ndarray'>
>>> type(t) != numpy.ndarray
False
>>> type(t) == numpy.ndarray
True
>>> type(t) != numpy.ndarray or t == None
array([False, False, False])
>>> type(t) != numpy.ndarray or t != None
array([ True,  True,  True])
>t=numpy.array([1,2,3])
>>>类型(t)
>>>类型(t)!=numpy.ndarray
假的
>>>类型(t)=numpy.ndarray
真的
>>>类型(t)!=numpy.ndarray或t==无
数组([False,False,False])
>>>类型(t)!=numpy.ndarray或t!=没有一个
数组([True,True,True])
最后两条语句似乎返回一个布尔列表,而不是其他语句中的T/F。显然,如果我们想测试obj是否是一个numpy数组,我们将由于模糊性而遇到ValueError


为什么它会这样做?

不返回布尔值,它返回一个操作数;因此,要么是它的左手表达式的结果,要么是它的右手表达式的结果(以第一个为准)。如果左侧表达式为false,它将计算并返回其右侧表达式。numpy数组上的
t==None
返回一个值数组


不过,所有这些测试都是不好的做法。使用
isinstance
测试类型,以及是否等于
None
使用
isnone

应该有助于消除混淆-
是惰性的-如果左侧给出
True
,则它不检查右侧-因此首先
给出一个
True
,因为左侧给出
True
。右侧分别检查每个元素,并分别给出每个元素的结果。您必须使用
any()
all()
-
any(t!=None)
all(t!=None)
-这取决于您要检查的内容。在这种情况下,这不会对您造成伤害,但请注意在
语句中包含数组相等性测试。如您所见,
t==None
生成一个布尔数组<另一方面,code>或
是Python标量运算符。如果该布尔数组位于
的左侧,则将显示主题行错误。这里没有提到它,因为正如其他人所解释的,
只是返回该数组,而不是在测试中使用它。