Python中组合in与==运算符出现困惑行为的原因探究
Python中
in与==链式比较的求值逻辑解释 你遇到的这个现象是Python链式比较运算符的特性,属于Python语法里特殊但合规的设计。
核心规则:链式比较的等价展开
在Python中,像a op1 b op2 c这类连续的比较表达式(op1、op2可以是in、==、<、>等所有比较类运算符),会被解释器自动展开为:a op1 b and b op2 c
而且中间的b只会被计算一次,避免重复求值的开销。
对应例子的拆解
对于"w" in "w" == "w",按照链式规则会被展开成:("w" in "w") and ("w" == "w")
"w" in "w"结果为True(单个字符的字符串天然包含自身)"w" == "w"结果也为True
最终True and True返回True,这就是print输出True的原因。
你朋友的代码逻辑
他写的if ch in input[index] == test[index],同样会被展开为:ch in input[index] and input[index] == test[index]
这正好命中了他的需求——同时判断ch存在于input[index]中,且input[index]与test[index]相等,所以代码能正常工作。但这种写法可读性极差,实际开发里完全不推荐,应该拆成两个条件用and明确连接。
为什么和直觉不符?
你之前误以为会按运算符优先级先计算input[index] == test[index],再判断ch in这个布尔结果(那必然返回False,因为ch不可能是True或False)。但Python里所有比较运算符(包括in)优先级相同,且采用链式展开而非普通的左结合计算,这是Python独有的设计,和多数编程语言逻辑不同,所以容易产生困惑。
内容的提问来源于stack exchange,提问作者Christian Baker
相关产品推荐
相关产品推荐

