Python运算符优先级是语法解析规则,由AST结构决定,括号是唯一显式改写方式;and/or与&/|属不同层级,海象运算符:=优先级低于比较运算符,比较链等场景易因误解致逻辑错误。

Python 运算符优先级不是靠记忆背下来的,而是按官方文档定义的固定分组顺序起作用;直接查 operator 模块或 ast 解析树才能确认真实行为,靠“口诀”或经验容易出错。
运算符优先级本质是语法解析规则,不是运行时逻辑
Python 解释器在词法分析后,会把表达式构建成抽象语法树(AST),而优先级决定了树的结构——比如 a + b * c 一定被解析为 BinOp(left=a, op=Add(), right=BinOp(...)),而不是从左到右线性执行。这意味着:
- 括号
()是唯一能显式改写解析结构的方式,其余所有“优先级”都是语法层面的硬编码规则 -
and/or看似和&/|类似,但属于不同语法层级(布尔运算 vs 位运算),不能混用比较表达式而不加括号 - 赋值运算符
=在 Python 3.8+ 支持海象运算符:=,但它比所有比较运算符优先级都低,if x := y > 0:实际等价于if (x := y) > 0:,不是if x := (y > 0):
常见误判场景:比较链、布尔运算、位运算混用
这些地方最容易因优先级理解偏差导致逻辑错误:
- 比较链如
a 是特殊语法糖,等价于(a ,但不会短路求值中间项;而a 是两个独立布尔表达式,b可能被计算两次 -
x & y == z实际被解析为x & (y == z),因为==优先级高于&;想表达(x & y) == z必须加括号 -
not x in y等价于not (x in y),不是(not x) in y;同理not x is y也绑定为not (x is y)
如何快速验证某个表达式的实际解析方式
别猜,直接看 AST 或反编译字节码:
立即学习“Python免费学习笔记(深入)”;
- 用
ast.dump(ast.parse("表达式", mode="eval"), indent=2)查看语法树结构,最直观 - 用
dis.dis(lambda: 表达式)观察字节码执行顺序(注意:这反映的是运行时求值顺序,不等于语法优先级) - 官方优先级表以 https://www.php.cn/link/06a79a0a65d14504a0103acdf37f2f62 为准,表格中纵向位置越靠上,优先级越高;同一行内从左到右结合性不同(如
**右结合,+左结合)
真正麻烦的从来不是“哪个优先级高”,而是某些操作符(比如 lambda、条件表达式 if-else、海象运算符)嵌套时,括号缺位会导致 AST 结构完全偏离预期——这时候光看优先级表不够,得动手跑 ast.parse() 确认。











