Python运算符的优先级和结合性

优先级和结合性是Python表达式中比较重要的两个概念, 它们决定了先执行表达式中的哪一部分.

Python运算符优先级

所谓优先级, 就是当多个运算符同时出现在同一个表达式中, 先执行哪个运算符.

例如, 对于表达式a + b * c, Python会先计算乘法再计算加法, 因为*的优先级高于+.

Python支持几十种运算符, 被划分成将近二十个优先级, 有的运算符优先级不同, 有的运算符优先级相同, 请看下表.

Python运算符优先级和结合性一览表
运算符说明 Python运算符 优先级 结合性
小括号 () 19
索引运算符 x[i]x[i1:i2[:i3]] 18
属性访问 x.arrtibute 17
乘方 ** 16
按位取反 ~ 15
符号运算符 +(正号)) -(负号) 14
乘除 * / // % 13
加减 + - 12
位移 << >> 11
按位与 & 10
按位异或 ^ 9
按位或 | 8
比较运算符 == != > >= < <= 7
is运算符 is is not 6
in运算符 in not in 5
逻辑非 not 4
逻辑与 and 3
逻辑或 or 2
逗号运算符 , 1

虽然Python运算符存在优先级的关系, 但不推荐过度依赖运算符的优先级, 这会导致程序的可读性降低.

建议:

  • 不要把一个表达式写得过于复杂, 如果一个表达式过于复杂, 可以尝试把它拆分来书写;
  • 不要过多地依赖运算符的优先级来控制表达式的执行顺序, 这样可读性太差, 应尽量使用()来控制表达式的执行顺序.

Python运算符结合性

所谓结合性, 就是当一个表达式中出现多个优先级相同的运算符时, 先执行哪个运算符: 先执行左边的叫左结合性, 先执行右边的叫右结合性.

例如, 对于表达式100 / 25 * 16, /*的优先级相同, 应该先执行哪一个呢? 这个时候就不能只依赖运算符优先级决定了, 还要参考运算符的结合性. /*都具有左结合性, 因此先执行左边的除法, 再执行右边的乘法, 最终结果是64.

Python中大部分运算符都具有左结合性, 也就是从左往右执行; 只有单目运算符(例如not逻辑运算符), 赋值运算符和三目运算符例外, 它们具有右结合性, 也就是从右往左执.

总结

当一个表达式中出现多个运算符时, Python会先比较各个运算符的优先级, 按照优先级从高到低的顺序依次执行; 当遇到优先级相同的运算符时, 再根据将结合性决定先执行哪个运算符: 如果是左结合性就先执行左边的运算符, 如果是右结合性就先执行右边的运算符.