【发布时间】:2012-08-12 08:39:51
【问题描述】:
我知道这是有充分理由的,但我想知道是什么原因?
>>> print all([])
True
如果 all() 旨在检查可迭代对象上的每个项目是否评估为“True”,并且我们知道空列表的评估结果为 False
>>> bool([])
False
那么为什么 all() 对空列表返回 True 呢?
我已经阅读了文档,并且我知道实现
def all(iterable):
for element in iterable:
if not element:
return False
return True
但问题是为什么不呢?
def all(iterable):
if not iterable:
return False
for element in iterable:
if not element:
return False
return True
这有逻辑吗?如果您有已完成任务的列表
today_todo_status = [task.status for task in my_todo if task.date == today]
can_i_go_home = all(today_todo_status)
好的,在上面的假设示例中,如果我没有任务,那么我就可以回家了。
但还有其他情况,我不认为 all() 是为待办事项列表制作的。哈哈
编辑 >
【问题讨论】:
-
正如所指出的,所有状态同时为真和假,空集不包含任何内容。对您的示例真正有意义的不是
all(today_todo_tasks),而是any(map(lambda task: task.status != DONE, today_todo_tasks))。 -
C# Linq All 扩展方法的行为方式相同。
-
我认为@MarkMikofski 提到的副本对为什么提出问题有更清晰的解释。
标签: python