Python运算符优先级需结合优先级、结合性与短路求值三者理解:-等左结合,右结合;and/or短路但不改变分组;and/or返回操作数本身而非布尔值,易致隐式类型陷阱。

Python 运算符优先级表不是死记硬背的清单
Python 的运算符优先级确实有官方表格,但实际写代码时,靠硬背 ** 高于 *、and 低于 == 很容易出错。真正起作用的是三股力量共同约束:优先级(precedence)、结合性(associativity)和短路求值(short-circuit evaluation)。这三者不拆开理解,就容易在复杂表达式里踩坑。
结合性只对同级运算符生效,且多数是左结合
结合性解决的是“多个相同优先级运算符连用时,先算哪边”的问题。比如 a - b - c 是 (a - b) - c 而非 a - (b - c),因为 - 是左结合。但注意:
-
**是右结合:2 ** 3 ** 2等价于2 ** (3 ** 2),结果是512,不是(2 ** 3) ** 2 == 64 - 赋值类运算符(
=,+=等)也是右结合:a = b = 5合法,等价于b = 5; a = b -
lambda,if-else表达式、条件运算符(if...else)是右结合,但它们优先级极低,常被括号包围,实际影响小
短路求值只发生在 and / or / not 上,且不改变优先级本身
短路是运行时行为,不是语法解析规则。它不影响表达式如何被分组,只影响子表达式是否执行。例如:
a = 0 b = 1 result = a and b / a # 不报 ZeroDivisionError,因为 a 为 False,b / a 根本不求值
但注意:and 和 or 的优先级仍低于比较运算符,所以:
立即学习“Python免费学习笔记(深入)”;
-
False and True or True→(False and True) or True→True(不是False and (True or True)) -
x > 0 and y != 0 or z == "ok"中,and先于or,但整个表达式仍按优先级分组,短路只决定是否计算y != 0或z == "ok"
最容易被忽略的陷阱:布尔上下文 + 低优先级 + 隐式类型转换
很多人以为 and/or 总是返回 True/False,其实它们返回的是**最后一个被求值的操作数本身**:
-
"" or "hello"返回"hello"(字符串),不是True -
[] and [1, 2]返回[](空列表),不是False - 当混用算术与逻辑时,比如
1 or 2 + 3,加法根本不会执行(因为1真值,短路),但若写成0 or 2 + 3,就会得到5 - 最危险的是把它当三元替代:
a = x and y or z在y为假值(如0、""、[])时会错误返回z,正确写法应是y if x else z
这种隐式行为叠加低优先级,会让调试变得非常反直觉——你以为在做布尔判断,其实在做值选择。










