在这个答案https://stackoverflow.com/a/27680814/3456281中,提出了以下结构
a=[1,2]
while True:
if IndexError:
print ("Stopped.")
break
print(a[2])
实际打印"停止。"和中断(用Python 3.4.1测试)。
为什么?为什么if IndexError
合法?为什么a[2]
不会引发IndexError
而没有try ... except
?
答案 0 :(得分:28)
所有对象都有一个布尔值。如果没有另外定义,则该布尔值为True。
所以这段代码就等同于做if True
;所以执行立即到达break
语句,永远不会到达print
。
答案 1 :(得分:3)
查看Python documentation,Python标准库的内置类型下的真值测试部分。第一个句子和最后一个项目符号后的第一个句子回答了你的问题。
任何对象都可以测试真值......
和
所有其他值都被认为是真的 - 所以很多类型的对象都是 总是如此。
以下是文档的全文(括号中的内容,[]
,作为扩充添加):
5.1。真值测试
可以测试任何对象的真值,以便在if或while中使用 条件或下面的布尔运算的操作数。下列 值被视为错误:
None
False
任何数字类型的零,例如
0
,0L
,0.0
,0j
。任何空序列,例如
''
,()
,[]
。任何空映射,例如
{}
。用户定义类的实例,如果类在Python 2中定义
__bool__()
[__nonzero__()
]或__len__()
方法,则该方法返回整数零或bool价值False
。 [参见Python语言参考的数据模型,特殊方法名称,第Basic Customization部分]所有其他值都被认为是真的 - 所以很多类型的对象都是 总是如此。
始终具有布尔结果的操作和内置函数 返回
0
或False
表示false,1
或True
表示true,除非另有说明 说明。 (重要的例外:布尔操作or
和and
始终 返回他们的一个操作数。)
<强>结论强>
因为Exception
没有__bool__
,__nonzero__
或__len__
,(也不属于上面列出的其他条件)Exception
个对象将始终在布尔上下文中作为True
进行测试。