当"if not []"成功时,为什么"[] == False"评估为False?

a b*_*der 31 python

我问这个是因为我知道检查列表是否为空的pythonic方法如下:

my_list = []
if not my_list:
    print "computer says no"
else:
    # my_list isn't empty
    print "computer says yes"
Run Code Online (Sandbox Code Playgroud)

将打印computer says no,等等,这使我认识[]False真值; 但是,如果我尝试直接比较[]和False,我会得到以下结果:

>>> my_list == False
False
>>> my_list is False
False
>>> [] == False
False
Run Code Online (Sandbox Code Playgroud)

等等...

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

And*_*ark 52

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

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

>>> bool([])
False
>>> bool([]) == False
True
Run Code Online (Sandbox Code Playgroud)

请参阅有关真值测试的文档,空列表被视为错误,但这并不意味着它们等同于False.

PEP 285也有一些关于它为何以这种方式实现的优秀信息,请参阅已解决问题部分中的最后一个子弹,该部分涉及x == Truex == False具体处理.

对我来说最有说服力的一点是,==它通常具有传递性,因此a == b也就是b == c暗示a == c.因此,如果它是您期望的方式并且[] == False是真实的并且'' == False是真的,那么可以假设它[] == ''应该是真的(即使它显然不应该是没有隐式类型转换的语言).

  • "即使它显然不应该,"***Javascript***. (19认同)

kin*_*all 14

空容器是"虚假的",也就是说,它们False 在布尔上下文中评估.这并不意味着它们在字面上等于常数False.

换句话说,以下是True:

bool([]) == False
Run Code Online (Sandbox Code Playgroud)

对象的真值由其__nonzero__()或其__len__()方法确定.(在Python 3中,__nonzero__()已经重命名为__bool__().)容器有一个__len__()方法,所以当它们有任何内容时它们是真实的,而当它们是空的时它们是虚假的.

False顺便说一下,如果空容器在字面上是相等的,那么任何空容器都将等于任何其他空容器:例如,{} == ""将是True.而这根本就没有任何意义!

但是,只是为了打击你的想法,以下是True:

False == 0
Run Code Online (Sandbox Code Playgroud)

这是因为布尔值是Python中整数的子类,False基本上只是一个零点,打印方式略有不同.


jdi*_*jdi 7

Python中的内置类型具有真值,允许您测试它们的真实性.请参阅真值测试.

这与object == False进行实际价值测试(相等测试)的说法不同.它使用objects __eq__()方法来确定它们的值是否相等.