我知道这有充分的理由,但我想知道是什么原因?
>>> 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()(记录为" 如果iterable的所有元素都为真(或者如果iterable为空),则返回True . ")等效于以下内容:
def all(iterable):
for element in iterable:
if not element:
return False
return True
Run Code Online (Sandbox Code Playgroud)
由于没有元素,它将跳过循环并返回True.