2012-07-31 122 views
7

我正在测试列表以查看它是否为空。通常我使用len(list)== 0,而我隐约记得刚才读到的那个测试列表是否为空的正确方法是它是True还是False。布尔测试在Python中的列表

所以我尝试列表是False,并返回False。也许我想假设使用==?不然,那也返回了错误。列表为True,返回false,列表== True。

现在我很困惑,所以我做了快速谷歌,并在最后:Best way to check if a list is empty

顶端回答是:

if not a: 
    print "List is empty" 

所以我四处搜寻一些和蟒蛇手动结束其中4.1状态:

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

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

现在我很困惑。如果我测试一个列表就好像没有列表一样,它工作正常。但是,如果一个空列表是错误的,那么为什么我不能做,如果列表是False或者列表== False?

感谢

回答

11

空列表是不假,但是当你把它转换成一个布尔值,将其转换为False。同样,对于类型的字典,元组,字符串等:

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

当你把东西在if条款的条件,它是用于测试if的布尔值。这就是为什么if someListif bool(someList)相同。同样,not foo也不是布尔值,因此not []等于True。

+0

具体而言,调用[__nonzero__](http://docs.python.org/reference/datamodel.html#object.%5F%5Fnonzero%5F%5F)方法 – ernie 2012-07-31 03:41:28

0

将列表与False进行比较,测试列表的真相或虚假并不完全相同。空列表不等于False,但在布尔上下文中表现为False

这里的另一种方式来表达,这可能有助于这有道理:

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

正如其他人所说,在python bool([]) == False。 python程序员经常利用的一件事是运算符andor不(必然)返回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声明中会发生什么情况是,条件得到上述评价,然后蟒蛇隐式调用bool的结果 - 所以,你可以把它看成:

if condition: 

是一样的东西:

if bool(condition): 

就python而言。同样,对于not操作:

not condition 

是一回事

not bool(condition) 
1

mylist is False手段 “被命名为mylist完全相同的对象False对象?”

mylist == False手段 “是一个名为mylist等于对象False

not mylist的意思是” 不叫mylist对象的行为falsily?


这些都不是等价的:1 is not 1.01 == 1.0[] != Falsenot [] is True