Python运算符按固定优先级从高到低计算,括号最高,幂运算右结合,一元运算次之,乘除加减左结合,比较运算支持链式,调用与访问绑定最紧;不确定时用ast解析或加括号验证。

Python表达式按固定优先级从高到低依次计算,相同优先级则按结合性(多数为左结合)从左到右求值。理解这个规则,能避免括号滥用,也能预防隐含错误。
运算符优先级从高到低的关键层级
记住几个核心分界点比死记全部17级更实用:
-
括号 () 最高,强制改变求值顺序,比如
2 + 3 * 4是 14,但(2 + 3) * 4是 20 -
幂运算 ** 次高,且是右结合:
2 ** 3 ** 2等价于2 ** (3 ** 2)= 512,不是(2 ** 3) ** 2= 64 -
一元运算符 +、-、~(正负号、取反)紧随其后,如
-3 ** 2实际算的是-(3 ** 2)= -9,不是(-3) ** 2= 9 -
乘除模与加减 * / // % + - 属同一级,左结合,所以
8 / 4 * 2= 4.0,不是 1.0 -
比较运算符 == != > = 有链式特性:
1 等价于1 ,不是先算左边再和10比 -
逻辑运算符 not and or 优先级最低,且
and高于or:False or True and False结果是False(先算True and False)
常见易错场景与避坑建议
优先级不直观的地方最容易出 bug:
- 混合使用
and/or和位运算(&,|)时,位运算实际优先级更高,a & b == c等价于a & (b == c),通常应写成(a & b) == c - 用
is或in做条件判断时,注意它比==优先级还低?不对——is和==同级,但比and高,所以x is None and y > 0没问题;但x is y in z是合法的链式比较,等价于x is y and y in z - 函数调用
()、下标[]、属性访问.本身不是运算符,但它们绑定最紧密,比如obj.method()[i] + 1总是先取方法、再取索引、再加 1
快速验证与调试技巧
不确定时别猜,用 Python 交互环境直接试:
立即学习“Python免费学习笔记(深入)”;
- 用
ast.dump(ast.parse("表达式", mode='eval'), indent=2)查看抽象语法树,能清晰看到分组结构 - 对复杂布尔表达式,拆成中间变量,比如把
a + b * c > d and not e or f改成:tmp1 = b * ctmp2 = a + tmp1 > dtmp3 = not eresult = tmp2 and tmp3 or f - 多用括号——它不降低性能,只提升可读性和确定性,尤其在团队协作或维护代码中










