Python条件语句中位运算出现意外行为的原因咨询
位运算与布尔运算结果不符的原因解析
先看你提供的代码:
index = 0 time = '?' print(index) print(index == 1) print(time[0].isnumeric()) print(index == 1 & time[0].isnumeric()) print(index == 1 and time[0].isnumeric())
以及对应的输出:
0 False False True False
问题核心:运算符优先级
你得到意外结果的根源是位运算符&的优先级比比较运算符==更高,代码的实际执行顺序和你预想的完全不一样。
你原本想表达的是先分别判断两个条件,再对结果做位运算:(index == 1) & (time[0].isnumeric()),但Python实际执行的是:index == (1 & time[0].isnumeric())。
具体计算拆解
time[0].isnumeric()返回False,在Python里布尔值会隐式转成整数:False对应0,True对应1。- 先执行
1 & 0,位运算的结果是0。 - 最后判断
index == 0,而index的值就是0,所以结果为True。
而使用and的语句index == 1 and time[0].isnumeric()中,逻辑运算符and的优先级比==低,会先计算index ==1得到False,再和False做逻辑与运算,结果自然是False,符合你的预期。
修正方法
如果想让两个比较结果做位运算,手动加括号明确执行顺序即可:
print((index == 1) & (time[0].isnumeric()))
这样执行的就是False & False,结果为False。
内容的提问来源于stack exchange,提问作者Siddharth Kumar
相关产品推荐
相关产品推荐

