我问这个是因为我知道检查列表是否为空的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 == True并x == False具体处理.
对我来说最有说服力的一点是,==它通常具有传递性,因此a == b也就是b == c暗示a == c.因此,如果它是您期望的方式并且[] == False是真实的并且'' == False是真的,那么可以假设它[] == ''应该是真的(即使它显然不应该是没有隐式类型转换的语言).
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基本上只是一个零点,打印方式略有不同.
| 归档时间: |
|
| 查看次数: |
4166 次 |
| 最近记录: |