Python 3.6.4中if语句用&替代and出现异常的原因咨询
问题原因解析:位运算符
&与逻辑运算符and的区别 这个问题的核心是你混淆了Python中的位运算符&和逻辑运算符and——二者不仅功能完全不同,优先级差异也直接导致了你的条件表达式被解析成了和预期不符的逻辑。
1. &是位运算符,不是逻辑连接符
&的本职工作是对两个整数进行按位与运算,而非用来连接逻辑判断条件。更关键的是,它的优先级高于<这类比较运算符,这是导致你代码异常的根本原因。
2. 拆解你第一个代码的执行逻辑
你的原条件是:
if a < len(c) & len(b) < 3:
因为&优先级更高,Python会先执行len(c) & len(b):
len(c) = 150,二进制为10010110len(b) = 10,二进制为00001010- 按位与运算结果为
00000010,也就是整数2
此时条件表达式被转化为链式比较:0 < 2 < 3,这在Python中等价于0 < 2 and 2 < 3,结果为True,所以程序输出了yes。
3. 修改c长度后的执行逻辑
当len(c) = 152时:
152的二进制是10011000,和10按位与得到00001000(整数8)- 表达式变成
0 < 8 < 3,等价于0 < 8 and 8 < 3,结果为False,所以没有输出。
4. 为什么换成and就符合预期?
and是Python专门用于逻辑判断的运算符,它的优先级低于比较运算符:
- 程序会先分别计算
a < len(c)(0 < 150→True)和len(b) < 3(10 < 3→False) - 再对两个布尔值做逻辑与运算:
True and False→False,完全符合你原本的判断逻辑。
总结
- 写逻辑判断条件时,一定要用
and/or/not,不要误用位运算符&/|/~,除非你确实需要对整数进行位操作。 - 牢记Python的运算符优先级规则,避免因优先级问题导致表达式被错误解析。
内容的提问来源于stack exchange,提问作者gnikol
相关产品推荐
相关产品推荐

