Python中in运算符链式调用 True in [True] in [True] 输出False原因求解
核心原因:in是Python的比较运算符,遵循链式比较的特殊求值规则,而非普通运算符的左/右结合优先级逻辑。
首先先明确Python的链式比较规则:所有比较运算符(包括</>/<=/>=/==/!=/is/in)的连续调用,都会被自动展开为and连接的两段判断,且中间的公共操作数只会计算一次,通用逻辑为:
a 比较符1 b 比较符2 c 等价于 (a 比较符1 b) and (b 比较符2 c)
比如大家熟悉的1 < x < 10就是典型的链式比较,等价于1 < x and x < 10,不会被当成(1 < x) < 10计算。
对应你的三段代码分析:
1. 无括号的链式写法
print( True in [True] in [True] )
按照链式比较规则,它会被展开为:
print( (True in [True]) and ([True] in [True]) )
计算过程:
- 前半段
True in [True]结果为True - 后半段检查列表
[True]是否属于右侧的列表[True]:右侧列表的唯一元素是布尔值True,没有列表类型的元素,因此结果为False - 最终
True and False的结果为False,和运行结果一致。
2. 左加括号的写法
print( ( True in [True] ) in [True] )
这种写法是把in当成了左结合运算符,强制先计算左侧的True in [True]得到True,再计算True in [True]得到True,和原生链式比较的逻辑完全不同,结果自然不一样。
3. 右加括号的写法
print( True in ( [True] in [True] ) )
这种写法是把in当成了右结合运算符,强制先计算右侧的[True] in [True]得到False,再尝试计算True in False——但in的右操作数必须是可迭代对象,布尔值False不可迭代,因此直接抛出TypeError,同样不符合链式比较的规则。
内容的提问来源于stack exchange,提问作者arsalan
相关产品推荐
相关产品推荐

