我理解bool([])
False
的直觉。
但为什么bool([[]])
,bool([[[]]])
等都是True
?这背后的逻辑是什么?
答案 0 :(得分:5)
答案 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
,因此bool
为False
另一方面,[[]]
是一个包含项目的列表 - 项目本身是一个空列表,但外部列表包含该项目。因此,外部列表不为空(它包含一个空列表)。列表的长度为1
,而不是0
。因此,该列表的bool
为True
。
如果我们讨论的是包含所有错误值的列表,那将是相同的:
[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