8.2 else语句
和其他语言一样,Python提供了与if语句搭配使用的else语句。如果if语句的条件表达式的结果布尔值为假,那么程序将执行else语句后的代码。它的语法你甚至可以猜到:
这里是样例代码:
避免“悬挂else”
Python使用缩进而不是用大括号标记代码块边界的设计,不仅帮助强化了代码的正确性,而且还暗中帮助程序员避免了语法上正确的代码中存在潜在的问题。其中一个问题就是(臭名)昭著的“悬挂else”(dangling else)问题,一种语义错觉。
我们在这里给出一段C代码来说明我们的例子(K&R和其他的编程教材也给出过)(这里的K&R是指由Brian W. Kernighan和Dennis M. Ritchie合著的《C程序设计语言》,译者注):
问题是else属于哪个if?在C语言中,规则是else与最近的if搭配。所以我们上面的例子中,else虽然是想和外层的if搭配,但是事实上else属于内部的if,因为C编译器会忽略额外的空白。结果,如果你的balance是正数但小于最小值,你将得到错误的输出,程序会显示你的balance是零或者为负数。
由于这个例子很简单,所以解决这个问题并不难,但是如果是大块的代码嵌入到了类似这样的框架中,那么发现并改正程序中的错误需要耗费很多精力。Python设置的护栏不仅阻止你掉下悬崖,而且会带你离开危险的境地。在Python中相同的例子对应如下的两种代码(只有一种是正确的):
或者是:
Python的缩进使用强制使代码正确对齐,让程序员来决定else属于哪一个if。限制你的选择从而减少了不确定性,Python鼓励你第一次就写出正确的代码。在Python中制造出“悬挂else”问题是不可能的。而且,由于不再使用大括号,Python代码变得更易读懂。