为什么 python all([[False, True],[False, False]]) 被认为是 True

问题描述 投票:0回答:3

标题几乎说明了一切。如果我问 Python 什么是

all(test = [[False, True],[False, False]])
,它会输出 True:

all(test)
Out[279]: True 

我在玩 Python 的布尔值,发现这个很难理解。

如果我把它变成一个 Numpy 数组,

test = np.array([[False, True],[False, False]])
,它输出 False:

test.all()
Out[283]: False
python arrays numpy boolean
3个回答
2
投票

Numpy 以一种更注重数学的方式来实现它,它实际上会查看所有列表中的所有值。另一方面,Python 解释器从编程的角度来看它。

all([[False, True],[False, False]])
评估为
True
的原因是由于 Python 的两个怪癖。

  1. all(iterable)
    函数查看可迭代对象中的每个元素并检查它们是否全部为真。
  2. 不为空的列表是真实的。

all()
函数检查超级列表中的每个元素,并查看它是结构化的
[list, list]
。但是
all()
不是进入每个子列表,而是简单地评估每个子列表是否“真实”。由于子列表中都包含值,因此它们都是真实的,因此计算结果为
True
。最后,
all()
只看到超级列表由两个 truthy 元素组成,因此它返回
True
.


0
投票

很酷的问题。解决这个问题的最佳方法是在 Python REPL 中亲自尝试:

$ python
[Clang 14.0.0 (clang-1400.0.29.202)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> bool([False])
True
>>> bool(False)
False
>>> all([[]])
False
>>> all([[False]])
True

但是,嘿,我是谁,只是一只卑微的乌鸦,站在巨人的肩膀上。在此处查看这个答案以获取更多详细信息和说明。


0
投票

在 python 中,非空列表是“真实的”

>>> bool([False, True])
True

all
没有比这更深入地观察对象了。你给了它两个非空列表,你得到了
True
作为回报。

ndarray.all
做同样的事情,除了它看起来更深入数组。这就是 numpy 的意义所在——它向它的元素广播一个操作。您可以调整其参数的完成方式,例如
axis
将考虑数组的子集。

您可以通过迭代内部列表来使用 vanilla python 做类似的事情:

>>> test = [[False, True],[False, False]]
>>> all(val for inner in t2 for val in inner)
False
© www.soinside.com 2019 - 2024. All rights reserved.