Python all()和bool()空案例?

时间:2014-06-26 04:41:33

标签: python built-in

使用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的是什么? 它是如何回归真实的,因为它依赖于布尔?

4 个答案:

答案 0 :(得分:13)

如果bool()的参数为空,则永远不会调用

all()。这就是为什么文档指出all()在空输入上的行为是一种特殊情况。

行为bool() == Falseall()在任何情况下的行为无关。顺便说一句,在bool中,intbool() == False的子类,因此int() == 0必须与all([])兼容。

至于为什么,例如Truex,这是为了保留有用的身份。最重要的是,对于任何非空序列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)

所以空迭代器“真空”。这是有道理的,并且与逻辑中的类似概念相对应 - 我们通常说,即使存在主义不存在,一个通用量词也会在某个域上持有一些命题。