为什么Python内置的"all"函数为空迭代返回True?

Bru*_*uno 30 python

我知道这有充分的理由,但我想知道是什么原因?

>>> print all([])
True
Run Code Online (Sandbox Code Playgroud)

如果all()旨在检查iterable上的每个项是否评估为"True",并且我们知道空列表被评估为False

>>> bool([])
False
Run Code Online (Sandbox Code Playgroud)

那么为什么all()为空列表返回True?

<编辑>

我已经阅读了文档,我知道实现

 def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True
Run Code Online (Sandbox Code Playgroud)

但问题是为什么不呢?

def all(iterable):
    if not iterable:
        return False
    for element in iterable:
        if not element:
            return False
    return True
Run Code Online (Sandbox Code Playgroud)

这有一个逻辑吗?如果你有一个完成任务列表

today_todo_status = [task.status for task in my_todo if task.date == today]
can_i_go_home = all(today_todo_status)
Run Code Online (Sandbox Code Playgroud)

好吧,在上面的假设例子中,如果我没有任务,那真的很有道理,所以我可以回家了.

但还有其他情况,我不认为所有()都是为todo列表制作的.LOL

</ edit>

Int*_*ang 31

这表示为"对于S中的所有X,X为真".如果S为空,则没有X.然而,真实陈述仍然是真的,因为对于所有X,X都是真的......没有任何X!

这是使用逻辑的解释.

考虑两组A和B,其中A + B是两组的并集.

如果任何(A + B)=真 - >任何(A)或任何(B)=真但我们不能断言任何(A)=真或任何(B)=真.

如果有(A + B)= False - > any(A)= False且任何(B)= False.

如果all(A + B)= True - > all(A)= True且all(B)= True

如果all(A + B)= False - > all(A)= False或all(B)= False但我们不能断言all(A)= False或all(B)= False.

现在代替B,让我们将空集0添加到A.我们想要提出逻辑,以便添加空集不会更改all()或any()的值,因为A + 0 = A.

任何(A + 0)=任何(A)或任何(0)

any(0)必须为False,因此如果任何(A)为True,则任何(A + 0)为True,如果任何(A)为False,则任何(A + 0)为False.

全部(A + 0)=全部(A)和全部(0)

如果all(A)为True,则所有(A + 0)为True.因此,all(0)为True.

  • 正如这个答案(正确地)暗示的那样,all()函数旨在模仿数学中的通用量词,当应用于空集时,它被定义为真.请参阅http://en.wikipedia.org/wiki/Vacuous_truth,了解为何会出现这种情况,以及为什么许多人(包括OP)感觉不对. (17认同)

Eri*_*ric 9

all()(记录为" 如果iterable的所有元素都为真(或者如果iterable为空),则返回True . ")等效于以下内容:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True
Run Code Online (Sandbox Code Playgroud)

由于没有元素,它将跳过循环并返回True.

  • 这只是回答这个问题的循环逻辑."这是以这种方式定义的,因为这是它被定义的方式"并不是真正的答案...... (3认同)
  • 问题不在于它是如何运作的,而是为什么以这种方式运作.@Interrobang实际上提供了一个解释.就像rochacbruno问道,"为什么地球围绕太阳旋转,"你回答说,"因为轨道被定义为一个围绕另一个身体移动的身体,"Interrobang回答说,"引力". (2认同)