使用help(all)时,返回:
all(iterable)=>bool
return True if bool(x) is True for all values x in the iterable.
if the iterable is empty, return True
help(bool)返回:
bool(x) -> bool
|
| Returns True when the argument x is true, False otherwise.
| The builtins True and False are the only two instances of the class bool.
| The class bool is a subclass of the class int, and cannot be subclassed.
尝试时:
>>>bool()
False
>>>all([])
True
我的问题是,如果所有的输入都是空列表/ dict / tuple(即迭代器),那么传递给bool的是什么? 它是如何回归真实的,因为它依赖于布尔?
答案 0 :(得分:13)
bool()
的参数为空,则永远不会调用 all()
。这就是为什么文档指出all()
在空输入上的行为是一种特殊情况。
行为bool() == False
与all()
在任何情况下的行为无关。顺便说一句,在bool
中,int
是bool() == False
的子类,因此int() == 0
必须与all([])
兼容。
至于为什么,例如True
是x
,这是为了保留有用的身份。最重要的是,对于任何非空序列all(x) == (bool(x[0]) and all(x[1:]))
,最好是
all([]) == True
和x
是唯一允许该身份适用于{{1}}的所有值的结果。
答案 1 :(得分:7)
all(iterable)
... documented等同于;
def all(iterable):
for element in iterable:
if not element:
return False
return True
...当且仅当列表中的任何值转换为False 时才返回 False。
由于传入的列表中没有元素,因此没有元素转换为False,函数调用的结果为True。
答案 2 :(得分:6)
[...]什么传递给布尔?
没什么 - 而不是bool()
的“无”。永远不会调用bool
。每个元素都是空的序列吗?是!毕竟,没有任何不是。
答案 3 :(得分:2)
我的猜测是它实现了类似的东西:
def all(inp):
return not any(not bool(x) for x in inp)
所以空迭代器“真空”。这是有道理的,并且与逻辑中的类似概念相对应 - 我们通常说,即使存在主义不存在,一个通用量词也会在某个域上持有一些命题。