Python比较表达式与'in'运算符的行为困惑及逻辑咨询
先逐个拆解你的三个代码片段:
第一个代码:
("x" in "x") != True
括号强制改变了运算顺序,先执行"x" in "x",结果是True,再判断True != True,自然输出False,这和你预期一致。第二个代码:
"x" in "x" != True
这里的关键是Python的比较运算符支持链式写法,而且in、not in、==、!=这些运算符属于同一优先级,链式比较的逻辑是:a op1 b op2 c等价于a op1 b and b op2 c,而不是你以为的从右往左执行或者单纯的左结合嵌套。
所以这个代码等价于:("x" in "x") and ("x" != True)。
拆分后:"x" in "x"是True,"x"是字符串,True是布尔值,两者类型不同,所以"x" != True也是True。两个True做逻辑与运算,结果就是True。第三个代码:
"x" in ("x" != True)
括号强制先执行"x" != True,得到True(布尔值)。然后尝试判断"x"是否在True中,但布尔值不是可迭代对象,所以直接抛出TypeError: argument of type 'bool' is not iterable。这也反过来证明第二个代码没有采用右结合的执行顺序,否则第二个代码就会和第三个一样报错了。
总结一下:Python的比较运算符(包括in、!=)支持链式比较,这种写法会被拆解成多个比较的逻辑与,而不是按普通的左/右结合嵌套执行,这就是前两个代码结果不同的核心原因。
内容的提问来源于stack exchange,提问作者GLNB

