Python中if表达式逻辑异常求助:为何输出‘Bye’而非‘Hi’
Python中if表达式逻辑异常求助:为何输出‘Bye’而非‘Hi’
兄弟,问题出在Python对链式比较的特殊处理逻辑上,你写的b > 0 != a > 0完全不是你以为的意思!
先给你掰明白Python的规则:当你把多个比较运算符(比如>、!=、<这类)连在一起写的时候,Python会把它拆解成两两连续比较,再用and连接,而不是你想的“把两个比较的结果拿来做不等于判断”。举个例子,x > y != z会被解析成x>y and y!=z,而不是(x>y) != (y>z)或者(x>y) != z。
回到你的代码,b > 0 != a > 0会被Python直接解析成:
(b > 0) and (0 != (a > 0))
我们一步步算:
- 先看
b > 0:你的b是-5,这显然不成立,结果是False - 逻辑与
and有个短路特性——只要第一个条件是False,后面的判断直接跳过,整个表达式结果就是False - 所以if的条件不满足,自然就走到else分支打印
Bye了
至于你说把!=改成and not也没用,这很正常啊:改成b >0 and not a>0后,b>0还是False,and一遇到False直接返回False,条件还是不成立,当然还是打印Bye。
那怎么写才能达到你想要的“一个为真另一个为假”的效果?很简单,用括号把两个比较的结果明确括起来,告诉Python你要比较的是两个布尔值:
a = 5 b = -5 if (b > 0) != (a > 0): print("Hi") else: print("Bye")
这样(b>0)是False,(a>0)是True,False != True结果为True,就会打印你想要的Hi了。
备注:内容来源于stack exchange,提问作者Mike Evans




