为什么Python中n in l is True这类链式布尔判断返回False
代码返回False的核心原因
这个现象是Python的比较运算符链式求值规则导致的:
- Python中
in、is、==均属于比较运算符,支持链式比较语法,链式比较会自动按逻辑与拆分求值 - 对形如
a 比较符1 b 比较符2 c的表达式,等价于(a 比较符1 b) and (b 比较符2 c),且只会计算到第一个不成立的条件就提前终止返回False
注:这不是运算符优先级导致的问题,是Python为比较运算符专门设计的语法特性,我们常用的
0 < num < 100这类范围判断就是该特性的典型用法,只是搭配in、is这类比较运算符时容易忽略链式求值逻辑导致踩坑。
针对你给出的两个表达式的具体拆解
1. print(n in l is True)
按照链式比较规则,等价于:
(n in l) and (l is True)
- 前半部分
n in l结果为True - 后半部分
l is True判断的是列表[1,2,3]本身是否和True是同一个对象,显然不成立,结果为False - 逻辑与运算最终结果为
False
2. print(n in l == True)
同理等价于:
(n in l) and (l == True)
- 前半部分
n in l结果为True - 后半部分判断列表
[1,2,3]是否和True相等,Python中非布尔类型的容器对象和布尔值比较结果都是False - 最终结果为
False
正确写法验证
你提到的加括号改变运算优先级的写法是正确的:
print( (n in l) is True ) # 输出 True print( (n in l) == True ) # 输出 True
实际开发中不需要额外加is True或者== True判断,直接使用n in l作为布尔值判断即可。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

