Python中逻辑运算符and与按位运算符&的区别及问题解析
为什么Python中&和and的条件判断结果不同?
我在编写查找最大奇数的练习代码时遇到问题:使用&连接两个条件时,即使第二个条件为假,整体结果仍为真;换成and后结果正确。以下是我的代码及输出:
x = 21 y = 57 z = 7 a = x if x > y: a = y if y > z: a = z elif x > z: a = z if x%2 != 0: a = x if y%2 != 0 & (y > a): a = y if z%2 != 0 & (z > a): a = z print(z%2 != 0 & (z > a)) print(z%2 != 0 and (z > a)) print(a)
输出:
True False 7
为何&和and输出不同?二者是否等价?我了解到&检查数值的实际位,and评估表达式,还看到说&是“惰性”检查的说法。
核心结论:&和and完全不等价,差异源于功能与优先级
功能本质天差地别
and是逻辑运算符:专门用于布尔表达式的逻辑判断,遵循“短路求值”——只要前一个条件为假,后一个条件不会再计算,直接返回假。&是按位与运算符:作用是对两个整数的二进制位进行逐位与运算,和逻辑判断完全无关,只有操作二进制位时才用得到它。
运算符优先级导致计算顺序错误
你的代码出问题的直接原因是优先级:- 在
z%2 != 0 & (z > a)中,&的优先级比!=高,实际计算顺序是先算0 & (z > a)。这里z > a是7>21,结果为False(Python中False等价于整数0),所以0 & 0得0,表达式最终变成z%2 != 0,7%2=1,1!=0结果为True。 - 而
and优先级比!=低,z%2 != 0 and (z > a)会先算z%2 !=0(结果True),再算z>a(结果False),最后True and False得到False,这才是你想要的逻辑判断结果。
- 在
另外你听到的“&是惰性检查”是错误的——&会强制计算所有操作数,不会短路;and才是支持短路求值的逻辑运算符。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

