You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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完全不等价,差异源于功能与优先级

  1. 功能本质天差地别

    • and是逻辑运算符:专门用于布尔表达式的逻辑判断,遵循“短路求值”——只要前一个条件为假,后一个条件不会再计算,直接返回假。
    • &是按位与运算符:作用是对两个整数的二进制位进行逐位与运算,和逻辑判断完全无关,只有操作二进制位时才用得到它。
  2. 运算符优先级导致计算顺序错误
    你的代码出问题的直接原因是优先级:

    • 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 15:12:09