2

任何人都可以解释为什么在这种情况下在 python 内置 buinction中all返回?Trueall([])

In [33]: all([])
Out[33]: True

In [34]: all([0])
Out[34]: False

In [35]: __builtins__.all([])
Out[35]: True
4

5 回答 5

6

我不相信任何其他答案都真正解决了为什么会这样的问题。

Python 的定义all()来自布尔逻辑。例如,如果我们说“所有天鹅都是白色的”,那么一只黑天鹅就反驳了这个说法。然而,如果我们说“所有的独角兽都是粉红色的”,逻辑学家会认为这是一个正确的陈述,因为没有非粉红色的独角兽。或者换句话说,“所有”都是空洞的

实际上,它给了我们一个有用的不变量。如果all(A)all(B)都为真,那么 的组合all(A + B)也为真。如果all({})是假的,我们应该有一个不太有用的情况,因为组合两个表达式,其中一个是假的突然会给出一个意想不到的真结果。

因此 Pythonall([]) == True取自布尔逻辑,并与其他具有类似结构的语言保持一致。

回到 Python 中,在许多情况下,空洞的事实使算法变得更简单。例如,如果我们有一棵树并且想要验证所有节点,我们可能会说一个节点是有效的,如果它满足某些条件并且它的所有子节点都是有效的。有了另一种定义,all()它变得更加复杂,因为我们不得不说它是有效的,如果它满足条件并且没有孩子或者它的所有孩子都是有效的。

class Node:
    def isValid(self):
        return some_condition(self) and all(child.isValid for child in self.children)
于 2012-12-06T08:56:32.337 回答
2

文档

如果可迭代对象的所有元素都为真(或可迭代对象为空),则返回 True。

所以,粗略地说,它只是这样定义的。

你可以通过使用来解决这个问题

list = []
if list and all(list):
    pass
于 2012-12-06T07:40:00.497 回答
2

正如文档所说all相当于:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

对于空iterable的循环体永远不会执行,所以True会立即返回。

于 2012-12-06T07:40:10.457 回答
0

任何表达式all都可以重写,any反之亦然:

not all(iterable)
# is the same as:
any(not x for x in iterable)

并且对称

not any(iterable)
# is the same as:
all(not x for x in iterable)

这些规则要求all([]) == True.


该函数all对于可读的断言非常有用:

assert all(required_condition(x) for x in some_results_being_verified)

(如果一个任务没有结果,那还不错,但是如果任何结果不正确,那么事情就会很糟糕。)

于 2012-12-06T15:09:26.983 回答
0

对此的另一种解释是all和是二元运算符和任意长参数any的泛化。因此,和可以定义为:andorallany

def all(xs):
  return reduce(lambda x,y: x and y, xs, True)

def any(xs):
  return reduce(lambda x,y: x or y, xs, False)

和参数表明True和。Falseall([]) == Trueany([]) == False

于 2012-12-06T13:30:29.790 回答