这可能只是愚蠢的,但对我而言,这有点混乱:
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
?
您正在根据布尔 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
等 - 任何空的集合:
{}
(一个空的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
或通过 if
或 while
条件进行评估时,它只是"虚假"(两者都评估bool
转换他们的状况)。有关更多详细信息,请参见有关真实价值测试的文档。