Python中or条件顺序影响if语句执行结果的问题咨询
Python中or条件顺序影响if语句执行结果的问题咨询
嗨,我来帮你理清楚这个问题的根源哈~
你遇到的情况完全是因为Python里or操作符的短路求值特性,还有不同类型之间比较的限制,咱们慢慢拆解:
首先看你最初写的条件:
if((int(num)<smallest) or (smallest is None))
当smallest一开始是None时,Python会从左到右依次判断条件——先算左边的int(num) < smallest。这里你是拿整数和None做小于比较,在Python3里这种跨类型的比较是不被允许的,会直接触发TypeError;就算是在允许这种比较的Python2里,这个表达式的结果也是False。不管哪种情况,左边的条件都没法得到True,更关键的是,因为or的短路逻辑,左边的表达式已经出问题或者结果为False了,但这时候程序也没法走到右边的smallest is None判断,直接导致整个if条件不成立,自然就跳过了if块。
再看你调整顺序后的条件:
if((smallest is None) or (int(num)<smallest))
这时候Python先判断左边的smallest is None,结果明显是True。而or的规则是:只要左边的条件为True,就不会再去执行右边的条件判断(这就是短路求值的核心),直接整个条件表达式返回True,所以if块就正常执行了。
你之前的预期是“当smallest是None时,程序会自动走到or的右边条件”,但其实or的执行逻辑是从左到右,只要左边能确定整个表达式的最终结果,就不会再碰右边的条件。而且第一种写法里,左边的比较本身就有问题,连走到右边判断的机会都没有,所以才会出现if语句完全不执行的情况。
备注:内容来源于stack exchange,提问作者Lisa




