幂运算最高(右结合),接着是///%(左结合),然后是+-(左结合),再是==!=(左结合),最后是赋值=(右结合);例如-32得-9,2+34先算乘,10-3+2从左得9,3+4==7无需括号。

Python 运算符优先级没有官方口诀,但靠死记表格容易混淆——真正管用的是按「结合性 + 常见组合」分层理解,再配几个短小精准的助记点。
记住这 5 层结构,覆盖 95% 场景
不用背全部 17 级,日常写代码高频出现的就这几层,从高到低:
-
**(右结合)→ 幂运算单独一层,比+-高得多,-3**2是-9不是9 -
*///%(左结合)→ 四则中除法类统一高于加减,2 + 3 * 4先算乘 -
+-(左结合)→ 加减同级,10 - 3 + 2从左算得9,不是5 -
==!=>>=(左结合)→ 比较运算符同级且低于算术,3 + 4 == 7没括号也对;但3 是True and False→False(链式比较!) -
andornot(not最高,and次之,or最低)→not优先于and,and优先于or;False or not True and True等价于False or ((not True) and True)
最容易踩坑的 3 种情况
优先级本身不难,难在「看起来像会那样算,其实不是」:
-
is和==优先级相同,但语义完全不同:x is y == z是链式比较,等价于(x is y) and (y == z),不是(x is y) == z -
lambda优先级最低,所以lambda x: x + 1 == 2被解析为lambda x: (x + 1 == 2),不是(lambda x: x + 1) == 2 -
await优先级低于**,高于*:即await x ** 2合法,但await x * 2会报SyntaxError,必须写成(await x) * 2
调试时快速验证优先级的方法
别猜,用 ast 模块看 Python 实际怎么解析:
立即学习“Python免费学习笔记(深入)”;
import ast
print(ast.dump(ast.parse('a + b * c', mode='eval'), indent=2))输出里能看到 BinOp 的 op 是 Mult 包在 Add 里面,说明 * 先于 +。对复杂表达式(比如含 and/or/if-else 三元)尤其有用。
真正要留心的不是「哪一级最高」,而是「哪些看似并列实则分层」——比如 not 看起来和 and 都是逻辑词,但它绑定更紧;又比如 is 和 in 优先级一样,但没人会把它们混着链式写。多写两行括号,远比查表省心。











