Python中为何‘&’与‘and’运算符结果不同?条件布尔值一致
问题解析:
and与&导致结果不同的原因 这个问题的核心是运算符优先级差异,这是Python新手非常容易踩的一个坑!我们来一步步拆解你的代码:
用and的情况
你的第一个表达式:
x = a if a>b and a>c else b if b>c else c
逻辑与运算符and的优先级低于比较运算符>,所以Python会先分别计算两个比较条件:
a>b→70>40→Truea>c→70>60→True
再用and合并这两个布尔值:True and True→True,因此条件成立,直接取a的值70,这和你预期的一致。
用&的情况
你的第二个表达式:
x = a if a>b & a>c else b if b>c else c
这里的&是按位与运算符,它的优先级比比较运算符>要高得多!所以Python会先执行b & a,而不是先计算a>b:
- 先计算按位与:
b=40的二进制是101000,a=70的二进制是1000110,按位与的结果是0010000,也就是十进制的16。 - 接下来表达式会被解析为
(a > (b & a)) > c:a > 16→70>16→True- 布尔值
True在数值运算中会被当作1,所以True > c→1 > 60→False
- 整个条件
a>b & a>c的结果是False,于是进入else分支,判断b>c(40>60→False),最终取c的值60,这就是你看到的错误结果。
额外提示
如果你非要用&实现类似逻辑与的效果(非常不推荐,逻辑判断就该用and),需要给每个比较表达式加上括号,强制改变运算顺序:
x = a if (a>b) & (a>c) else b if b>c else c
这样会先计算(a>b)和(a>c)得到两个True,按位与后结果还是True,就能得到正确的最大值70了。
记住:逻辑判断场景用and/or/not,按位操作(比如处理二进制位)才用&/|/~,它们的功能和优先级完全不同,千万别混用!
内容的提问来源于stack exchange,提问作者Srinivas




