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 或反编译字节码: