我正在测试一个列表,看它是否为空。通常情况下我使用len(list)== 0而且我依旧记得在不久前读过,测试列表是否为空的正确方法是它是真还是假。
所以我试过list是False,返回False。也许我想要使用==? 不,那也是假的。 list为True,返回false,如list == True。
现在我很困惑,所以我快速谷歌并最终:Best way to check if a list is empty
最佳答案是:
if not a:
print "List is empty"
所以我搜索了一些更多内容并最终在4.1中指出的python手册中:
可以测试任何对象的真值,用于if或while条件或下面布尔运算的操作数。以下值被视为false:
任何空序列,例如'',(),[]。
现在我很困惑。如果我测试列表就好像不是列表,它可以正常工作。但是如果一个空列表是假的,那么为什么我不能这样做,如果list是False或者list == False?
由于
答案 0 :(得分:12)
空列表不是False,但是当您将其转换为布尔值时,它会转换为False。同样,对于dicts,元组,字符串等:
>>> [] == False
False
>>> bool([]) == False
True
>>> {} == False
False
>>> bool({}) == False
True
当您在if
子句的条件下放置某些东西时,它的布尔值用于测试if
。这就是if someList
与if bool(someList)
相同的原因。同样地,not foo
没有布尔值,因此not []
等于True。
答案 1 :(得分:2)
正如其他人所说,在python bool([]) == False
中。 python程序员经常利用的一件事是运算符and
和or
不一定(必然)返回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)
答案 2 :(得分:1)
mylist is False
表示“名为mylist
的对象与False
完全相同的对象?”
mylist == False
表示“名为mylist
的对象是否等于 False
?
not mylist
表示“名为mylist
的对象是否表现不佳?
这些都不等同:1 is not 1.0
但1 == 1.0
和[] != False
但not [] is True
。
答案 3 :(得分:0)
将列表与False
进行比较,测试列表的真实性或虚假性并不完全相同。空列表不等于False
,但在布尔上下文中表现为False
。
这是另一种说法,可能有助于理解这一点:
print (bool([]) == False) # will print True
print ([] == False) # will print False