6.16. 运算符优先级

下表对 Python 中运算符的优先顺序进行了总结,从最低优先级(最后绑定)到最高优先级(最先绑定)。 相同单元格内的运算符具有相同优先级。 除非句法显式地给出,否则运算符均指二元运算。 相同单元格内的运算符均从左至右分组(除了幂运算是从右至左分组)。

请注意比较、成员检测和标识号检测均为相同优先级,并具有如 比较运算 一节所描述的从左至右串连特性。

运算符描述
lambdalambda 表达式
ifelse条件表达式
or布尔逻辑或 OR
and布尔逻辑与 AND
not x布尔逻辑非 NOT
in, not in,is, is not, <,<=, >, >=, !=, ==比较运算,包括成员检测和标识号检测
|按位或 OR
^按位异或 XOR
&按位与 AND
<<, >>移位
+, -加和减
, @, /, //, %乘,矩阵乘,除,整除,取余 5
+x, -x, ~x正,负,按位非 NOT
*乘方 6
await xawait 表达式
x[index], x[index:index],x(arguments…), x.attribute抽取,切片,调用,属性引用
(expressions…),[expressions…],{key: value…},{expressions…}绑定或加圆括号的表达式,列表显示,字典显示,集合显示

备注

  • 1
  • 虽然 abs(x%y) < abs(y) 在数学中必为真,但对于浮点数而言,由于舍入的存在,其在数值上未必为真。 例如,假设在某个平台上的 Python 浮点数为一个 IEEE 754 双精度数值,为了使 -1e-100 % 1e100 具有与 1e100 相同的正负性,计算结果将是 -1e-100 + 1e100,这在数值上正好等于 1e100。 函数 math.fmod() 返回的结果则会具有与第一个参数相同的正负性,因此在这种情况下将返回 -1e-100。 何种方式更适宜取决于具体的应用。

  • 2

  • 如果 x 恰好非常接近于 y 的整数倍,则由于舍入的存在 x//y 可能会比 (x-x%y)//y 大。 在这种情况下,Python 会返回后一个结果,以便保持令 divmod(x,y)[0] * y + x % y 尽量接近 x.

  • 3

  • Unicode 标准明确区分 码位 (例如 U+0041) 和 抽象字符 (例如 "大写拉丁字母 A")。 虽然 Unicode 中的大多数抽象字符都只用一个码位来代表,但也存在一些抽象字符可使用由多个码位组成的序列来表示。 例如,抽象字符 "带有下加符的大写拉丁字母 C" 可以用 U+00C7 码位上的单个 预设字符 来表示,也可以用一个 U+0043 码位上的 基础字符 (大写拉丁字母 C) 加上一个 U+0327 码位上的 组合字符 (组合下加符) 组成的序列来表示。

对于字符串,比较运算符会按 Unicode 码位级别进行比较。 这可能会违反人类的直觉。 例如,"\u00C7" == "\u0043\u0327"False,虽然两个字符串都代表同一个抽象字符 "带有下加符的大写拉丁字母 C"。

要按抽象字符级别(即对人类来说更直观的方式)对字符串进行比较,应使用 unicodedata.normalize()

  • 4
  • 由于存在自动垃圾收集、空闲列表以及描述器的动态特性,你可能会注意到在特定情况下使用 is 运算符会出现看似不正常的行为,例如涉及到实例方法或常量之间的比较时就是如此。 更多信息请查看有关它们的文档。

  • 5

  • % 运算符也被用于字符串格式化;在此场合下会使用同样的优先级。

  • 6

  • 幂运算符 绑定的紧密程度低于在其右侧的算术或按位一元运算符,也就是说 2-10.5