16

这可能只是愚蠢的,但对我来说有点令人困惑:

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

4

3 回答 3

41

您正在对照 boolean 的文字值检查它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(明显地)
  • 任何空序列:'', [],()
  • 任何“零”值:0,0.0等。
  • 任何空集合:({}一个空字典)
  • 任何len()返回 a0

这些被称为“虚假”值。其他一切都是“真实的”。这可能会导致一些奇怪的事情,例如:

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

还需要注意的是,不返回显式值的方法总是将None其作为返回类型,这会导致:

>>> def bar():
...   x = 1+1
...
>>> bool(bar)
True
>>> bool(bar())
False
于 2012-10-21T11:21:57.733 回答
8

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

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

例如[1, 2] == [1, 2, 3]is False,即使两者都是“真的”。

于 2012-10-21T11:22:51.867 回答
3

这是因为空列表不是,它在转换为 a或由 an或条件评估False时只是“虚假” (两者都评估其条件的转换)。有关更多详细信息,请参阅有关真值测试的文档。boolifwhilebool

于 2012-10-21T11:23:06.620 回答