Python while循环中条件判断的顺序不同为何会产生不同运行结果?
问题原因解答
这个差异的底层逻辑是Python中逻辑与(and)的短路求值规则。
短路求值规则说明
对于A and B格式的逻辑表达式,Python的执行顺序和判定规则是固定的:
- 首先计算左侧表达式
A的布尔值 - 如果
A的布尔值为False,整个逻辑表达式的结果已经确定为False,Python会直接终止后续判断,不会执行右侧表达式B的逻辑 - 只有当
A的布尔值为True时,才会继续执行右侧表达式B的判断,最终返回B的结果作为整个表达式的结果
两段代码的执行差异分析
第一段报错代码
你写的判断条件为:
while (nums[-1]<k and nums ):
初始状态下nums是空列表,Python会优先执行左侧的nums[-1]<k判断,空列表不存在下标为-1的元素,直接触发list index out of range索引越界错误,程序还没来得及判断右侧的nums就直接崩溃。
第二段正常代码
你调换顺序后的判断条件为:
while( nums and nums[-1]<k ):
初始状态下nums是空列表,空列表的布尔值为False,触发短路求值规则,右侧的nums[-1]<k完全不会被执行,整个while条件直接返回False,循环不会进入,因此不会触发任何错误。
开发建议
写包含边界校验的逻辑判断时,要把边界校验类的判断放在逻辑与的最左侧,比如空值判断、长度判断、索引合法性判断等,可以有效避免索引越界、空指针调用这类常见错误。
内容的提问来源于stack exchange,提问作者Soumya Patel
相关产品推荐
相关产品推荐

