嵌套列表上的bool()运算符为空

时间:2016-03-18 17:35:53

标签: python

我理解bool([]) False的直觉。

但为什么bool([[]])bool([[[]]])等都是True?这背后的逻辑是什么?

6 个答案:

答案 0 :(得分:5)

空列表[]是假的。

[[]]是一个非空列表,包含一个元素 - 一个空列表。因此[[]]是真的。

有关详细信息,请参阅Truth Value Testing

答案 1 :(得分:2)

[[]]是一个包含一个列表的列表。 [[]]非空:

>>> len([[]])
1

这是一个虚假对象的列表,这是真的,它仍然是非零的。

对于容器,您可以将bool()视为"包含某些" 运算符。

答案 2 :(得分:1)

在列表中,bool(l)相当于len(l) > 0。它不是any(bool(i) for i in l)或一些查看列表中项目的测试。

答案 3 :(得分:1)

bool([])因为它是一个空列表。将其视为检查bool(len(L)) 该列表为空 - 列表的长度为0,因此boolFalse

另一方面,[[]]是一个包含项目的列表 - 项目本身是一个空列表,但外部列表包含该项目。因此,外部列表不为空(它包含一个空列表)。列表的长度为1,而不是0。因此,该列表的boolTrue

如果我们讨论的是包含所有错误值的列表,那将是相同的:

[False, False, False, False, False]

类似地:

[[], [], [], [], [], []]

在这两种情况下,列表的真值都是True。但是,any(i for i in outer_list)将返回False

答案 4 :(得分:0)

仅仅因为[[]][[[]]]不是空列表,请注意:

l = []
for el in l:
    print (el) # prints nothing

可是:

l = [[]]
for el in l:
    print(el) # prints [] that means list is not empty

因此:

l = []
not a # True
l = [[]]
not a # False

答案 5 :(得分:0)

除了解释原因的其他答案之外,这里还有一个递归方法,它对嵌套的不真实对象返回false:

from collections import Iterable

def nested_bool(item):
    if not isinstance(item, Iterable) or isinstance(item, basestring):
        if not item:
            return False
        return True
    return any(nested_bool(i) for i in item)

演示:

>>> nested_bool([[], [[], [[[['']]]]]])
False
>>> 
>>> nested_bool([[], [[], [[[['','']]]]]])
False
>>> 
>>> nested_bool([[], [[], [[[['',1]]]]]])
True
>>> 
>>> nested_bool([[], [[], [[[[]]]]]])
False