这可能只是愚蠢的,但对我来说有点令人困惑:
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
返回False
时False == False
返回True
?
您正在对照 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
空列表与 不同False
,但False
等于False
,因为它是同一个对象。bool(l)
返回False
,因为空列表是“假的”。
简而言之,==
不是bool() == bool()
。
例如[1, 2] == [1, 2, 3]
is False
,即使两者都是“真的”。
这是因为空列表不是,它在转换为 a或由 an或条件评估False
时只是“虚假” (两者都评估其条件的转换)。有关更多详细信息,请参阅有关真值测试的文档。bool
if
while
bool