我问这个是因为我知道检查列表是否为空的pythonic方法如下:
my_list = []
if not my_list:
print "computer says no"
else:
# my_list isn't empty
print "computer says yes"
将打印computer says no
等。这样我就可以识别[]
False
个真值;但是,如果我尝试直接比较[]和False,我会得到以下结果:
>>> my_list == False
False
>>> my_list is False
False
>>> [] == False
False
等等......
这里发生了什么?我觉得我错过了一些非常明显的东西。
答案 0 :(得分:51)
if
语句评估布尔上下文中的所有内容,就像对bool()
内置函数的隐式调用一样。
以下是如何通过if
语句实际检查事物的评估方式:
>>> bool([])
False
>>> bool([]) == False
True
请参阅Truth Value Testing上的文档,空列表被视为错误,但这并不意味着它们等同于False
。
PEP 285也有一些很好的信息,说明为什么以这种方式实施,请参阅已解决问题部分中的最后一个内容,了解处理x == True
和x == False
具体而言。
对我来说,最令人信服的方面是==
通常具有传递性,因此a == b
和b == c
隐含a == c
。因此,如果它是您期望的方式并且[] == False
是真的并且'' == False
是真的,那么可以假设[] == ''
应该是真的(即使它显然不应该是没有隐含的语言)类型转换)。
答案 1 :(得分:14)
空容器是" falsy,"也就是说,它们在布尔上下文中评估为False
。这并不意味着它们在字面上等于常数False
。
换句话说,以下是True
:
bool([]) == False
对象的真值由其__nonzero__()
或其__len__()
方法决定。 (在Python 3中,__nonzero__()
已重命名为__bool__()
。)容器具有__len__()
方法,因此当它们中包含任何内容时它们是真实的并且当它们为空时它们是虚假的。
顺便说一下,如果空容器在字面上等于False
,那么任何空容器都将等于任何其他空容器:例如,{} == ""
将是True
。而这根本就没有任何意义!
但是,为了让您大吃一惊,以下是True
:
False == 0
这是因为布尔值是Python中整数的子类,False
基本上只是一个零点,打印方式略有不同。
答案 2 :(得分:7)
Python中的内置类型具有真值,允许您测试它们的真实性。请参阅 Truth Value Testing 。
这与正在进行实际值测试(等式测试)的object == False
不同。它使用对象__eq__()
方法来确定它们的值是否相等。
答案 3 :(得分:3)
在您的示例中,not运算符会导致您的列表转换为布尔值。试试这个:
>>> not []
True
>>> not [1]
False
“是”和“==”不进行转换。