所有内置的空列表功能

时间:2012-12-06 07:37:49

标签: python

有人可以解释为什么python内置功能all在这种情况下返回True all([])吗?

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

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

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

5 个答案:

答案 0 :(得分:6)

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

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

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

因此Python从布尔逻辑中获取all([]) == True,并与具有类似构造的其他语言保持一致。

将其重新纳入Python,在许多情况下,真空事实使算法更简单。例如,如果我们有一棵树并且想要验证所有节点,我们可能会说节点在满足某些条件且其所有子节点都有效的情况下是有效的。使用all()的替代定义,这变得更加复杂,因为我们必须说它是有效的,如果它满足条件并且没有子女或其所有子女都有效。

class Node:
    def isValid(self):
        return some_condition(self) and all(child.isValid for child in self.children)

答案 1 :(得分:2)

来自docs

  

如果iterable的所有元素都为true(或者iterable为空),则返回True。

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

您可以使用

解决这个问题
list = []
if list and all(list):
    pass

答案 2 :(得分:2)

As the docs sayall相当于:

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

对于空iterable,循环体永远不会执行,因此会立即返回True

答案 3 :(得分:0)

对此的另一个解释是,allany是对任意长数量参数的二元运算符andor的推广。因此,allany可以定义为:

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)

TrueFalse参数显示all([]) == Trueany([]) == False

答案 4 :(得分: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)

(如果一项任务没有结果,那就没那么糟糕,但如果任何结果不正确,某些事情就会破裂。)