在Python中对列表进行布尔测试

在Python中对列表进行布尔测试,python,list,boolean,Python,List,Boolean,我正在测试一个列表,看它是否为空。通常我使用len(list)==0,我隐约记得不久前读到一篇文章,测试列表是否为空的正确方法是它是真是假 所以我尝试了列表为False,结果返回False。也许我应该用==? 不,这也返回了false。列表为True,与list==True一样返回false 现在我很困惑,所以我快速搜索了一下,结果是: 最重要的答案是: if not a: print "List is empty" 因此,我在python手册中搜索了更多内容,其中4.1规定: 任何对

我正在测试一个列表,看它是否为空。通常我使用len(list)==0,我隐约记得不久前读到一篇文章,测试列表是否为空的正确方法是它是真是假

所以我尝试了列表为False,结果返回False。也许我应该用==? 不,这也返回了false。列表为True,与list==True一样返回false

现在我很困惑,所以我快速搜索了一下,结果是:

最重要的答案是:

if not a:
    print "List is empty"
因此,我在python手册中搜索了更多内容,其中4.1规定:

任何对象都可以测试真值,用于if或while条件,或作为下面布尔运算的操作数。以下值被认为是错误的:

任何空序列,例如,,(),[]

现在我很困惑。如果我像测试非列表一样测试一个列表,它工作得很好。但若一个空列表为false,那个么为什么我不能在list为false或者list==false时执行呢


感谢

空列表不是False,但当您将其转换为布尔值时,它将转换为False。同样,对于dict、元组、字符串等:

>>> [] == False
False
>>> bool([]) == False
True
>>> {} == False
False
>>> bool({}) == False
True

当您将某个内容置于
if
子句的条件下时,它的布尔值用于测试
if
。这就是为什么
if someList
if bool(someList)
相同。同样地,
not foo
做了一个布尔not,因此
not[]
等于True。

将列表与
False
进行比较,并测试列表的真假不是一回事。空列表不等于
False
,但在布尔上下文中表现为
False

这里有另一种说法可能有助于理解这一点:

print (bool([]) == False) # will print True
print ([] == False) # will print False

正如其他人所说,在python中,bool([])==False。python程序员经常利用的一件事是操作符
不(一定)返回True/False。考虑以下事项:

3 and 4  #returns 4
0 and 8  #returns 0 -- This is short-circuit evaluation
0 or 8   #returns 8
True or 0 #returns True -- This is short-circuit evaluation

[] or False #returns False
False or [] #returns []
if
语句中发生的情况是,条件的计算如上所述,然后python隐式调用结果上的
bool
,因此您可以将其视为:

if condition:
与以下内容相同:

if bool(condition):
就python而言。对于
not
操作符,类似地:

not condition
是同一件事吗

not bool(condition)

mylist为False
表示“名为
mylist
的对象是否与
False
的对象完全相同?”

mylist==False
表示“名为
mylist
的对象是否等于
False

not mylist
表示“名为
mylist
的对象是否行为错误?”


这些都不是等价的:
1不是1.0
,而是
1==1.0
[]!=False
not[]为True

具体地说,调用该方法