这可能只是愚蠢,但对我来说有点令人困惑:
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
?
答案 0 :(得分:28)
您正在根据布尔值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()
返回0
这些被称为“假”值。 其他一切都是“真实的” 。这可能导致一些奇怪的事情,如:
>>> def foo():
... pass
...
>>> bool(foo)
True
此处还要注意,方法不返回显式值,总是将None
作为返回类型,这会导致:
>>> def bar():
... x = 1+1
...
>>> bool(bar)
True
>>> bool(bar())
False
答案 1 :(得分:6)
空列表与False
不同,但False
等于False
,因为它是同一个对象。 bool(l)
返回False
,因为空列表是“假的”。
简而言之,==
不是bool() == bool()
。
例如,[1, 2] == [1, 2, 3]
为False
,即使这两者是“真正的”。
答案 2 :(得分:3)
这是因为空列表不是False
,转换为bool
时只是“假”,或者由if
或while
评估时条件(两者都评估其条件的bool
转换)。有关详细信息,请参阅documentation on Truth Value Testing。