6.17. 运算符优先级

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

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

运算符

描述

:=

赋值表达式

lambda

lambda 表达式

ifelse

条件表达式

or

布尔逻辑或 OR

and

布尔逻辑与 AND

not x

布尔逻辑非 NOT

in, not in, is, is not, <, <=, >, >=, !=, ==

比较运算,包括成员检测和标识号检测

|

按位或 OR

^

按位异或 XOR

&

按位与 AND

<<, >>

移位

+, -

加和减

, @, /, //, %

乘,矩阵乘,除,整除,取余 5

+x, -x, ~x

正,负,按位非 NOT

*

乘方 6

await x

await 表达式

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