Python表达式求值规则_运算优先级说明【指导】

16次阅读

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

Python表达式求值规则_运算优先级说明【指导】

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 高于 orFalse or True and False 结果是 False(先算 True and False

常见易错场景与避坑建议

优先级不直观的地方最容易出 bug:

  • 混合使用 and / or 和位运算(&, |)时,位运算实际优先级更高,a & b == c 等价于 a & (b == c),通常应写成 (a & b) == c
  • isin 做条件判断时,注意它比 == 优先级还低?不对——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 * c
    tmp2 = a + tmp1 > d
    tmp3 = not e
    result = tmp2 and tmp3 or f
  • 多用括号——它不降低性能,只提升可读性和确定性,尤其在团队协作或维护代码中
text=ZqhQzanResources