35

我问这个是因为我知道检查列表是否为空的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

ETC...

这里发生了什么?我觉得我错过了一些非常明显的东西。

4

4 回答 4

57

if语句在布尔上下文中评估所有内容,就像对bool()内置函数的隐式调用一样。

if以下是您实际检查语句如何评估事物的方式:

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

请参阅关于Truth Value Testing的文档,空列表被认为是 false,但这并不意味着它们等同于False.

PEP 285还提供了一些关于为什么以这种方式实施的出色信息,请参阅“已解决问题”部分中的最后一个项目符号,以了解具体处理的x == True部分x == False

对我来说最有说服力的方面是它==通常是及物的,所以a == bb == c暗示a == c。因此,如果它是您所期望的方式并且[] == False是真实的并且'' == False是真实的,那么人们可能会认为这[] == ''应该是真实的(即使它显然不应该在没有隐式类型转换的语言中)。

于 2012-05-03T23:37:48.637 回答
14

空容器是“虚假的”,也就是说,它们False 在 Boolean context 中求值。这并不意味着它们实际上等于常量False

换句话说,以下是True

bool([]) == False

一个对象的真值是由它__nonzero__()或它的__len__()方法决定的。(在 Python 3 中,__nonzero__()已重命名为__bool__()。)容器有一个__len__()方法,所以当它们有任何东西时它们是真值,当它们为空时它们是假的。

顺便说一句,如果空容器实际上等于False,那么任何空容器都将等于任何其他空容器:例如,{} == ""将是True。那根本没有任何意义!

但是,为了让您大吃一惊,以下是True

False == 0

这是因为布尔值是 Python 中整数的子类,False基本上只是一个零,打印出来的结果略有不同。

于 2012-05-03T23:38:50.820 回答
7

Python 中的内置类型具有真值,可让您测试它们的真实性。请参阅真值测试

这与说object == False哪个在进行实际值测试(平等测试)不同。它使用对象__eq__()方法来确定它们的值是否相等。

于 2012-05-03T23:40:01.150 回答
3

在您的示例中, not 运算符导致您的列表转换为布尔值。试试这个:

>>> not []
True

>>> not [1]
False

"is" 和 "==" 不进行这种转换。

于 2012-05-03T23:44:04.083 回答