空列表布尔值



这可能只是愚蠢的,但对我而言,这有点混乱:

In [697]: l=[]
In [698]: bool(l)
Out[698]: False
In [699]: l == True
Out[699]: False
In [700]: l == False
Out[700]: False 
In [701]: False == False
Out[701]: True

为什么l==False返回FalseFalse == False返回True

您正在根据布尔 False的字面价值对其进行检查。与'A' == False相同。

如果施放,您会看到区别:

>>> l = []
>>> l is True
False
>>> l is False
False
>>> l == True
False
>>> l == False
False
>>> bool(l) == False
True

False == False是正确的原因是因为您正在比较相同的对象。它与2 == 2'A' == 'A'相同。

当您看到诸如if l:之类的事情并且此检查永远不会通过时,困难就会出现。那是因为您正在对项目的真实价值进行检查。按照惯例,所有这些项目都将使布尔检查失败 - 也就是说,它们的布尔值将为 False

  • None
  • False(显然)
  • 任何空序列:''[]()
  • 任何"零"值:00.0
  • 任何空的集合: {}(一个空的dict)
  • len()返回0
  • 的任何东西

这些称为"假"值。其他所有内容都是" true" 。这会导致一些奇怪的事情:

>>> def foo():
...   pass
...
>>> bool(foo)
True

也很高兴在这里注意到,方法不返回显式值,始终以None为返回类型 ,这导致了这一点:

>>> def bar():
...   x = 1+1
...
>>> bool(bar)
True
>>> bool(bar())
False

一个空列表与False不同,但是False等于False,因为它是同一对象。bool(l)返回False,因为一个空列表为"虚假"。

简而言之,==不是bool() == bool()

例如,即使两个是"真正的"。

[1, 2] == [1, 2, 3]False

这是因为空列表不是 False,而是转换为 bool或通过 ifwhile条件进行评估时,它只是"虚假"(两者都评估bool转换他们的状况)。有关更多详细信息,请参见有关真实价值测试的文档。

最新更新