在Python中对列表进行布尔测试
我正在测试一个列表,看它是否为空。通常我使用len(list)==0,我隐约记得不久前读到一篇文章,测试列表是否为空的正确方法是它是真是假 所以我尝试了列表为False,结果返回False。也许我应该用==? 不,这也返回了false。列表为True,与list==True一样返回false 现在我很困惑,所以我快速搜索了一下,结果是: 最重要的答案是:在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规定: 任何对
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
具体地说,调用该方法