标题几乎说明了一切。如果我问 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
Numpy 以一种更注重数学的方式来实现它,它实际上会查看所有列表中的所有值。另一方面,Python 解释器从编程的角度来看它。
all([[False, True],[False, False]])
评估为 True
的原因是由于 Python 的两个怪癖。
all(iterable)
函数查看可迭代对象中的每个元素并检查它们是否全部为真。all()
函数检查超级列表中的每个元素,并查看它是结构化的[list, list]
。但是 all()
不是进入每个子列表,而是简单地评估每个子列表是否“真实”。由于子列表中都包含值,因此它们都是真实的,因此计算结果为 True
。最后,all()
只看到超级列表由两个 truthy 元素组成,因此它返回 True
.
很酷的问题。解决这个问题的最佳方法是在 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
但是,嘿,我是谁,只是一只卑微的乌鸦,站在巨人的肩膀上。在此处查看这个答案以获取更多详细信息和说明。
在 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