6.17. 运算符优先级
下表对 Python 中运算符的优先顺序进行了总结,从最低优先级(最后绑定)到最高优先级(最先绑定)。 相同单元格内的运算符具有相同优先级。 除非句法显式地给出,否则运算符均指二元运算。 相同单元格内的运算符均从左至右分组(除了幂运算是从右至左分组)。
请注意比较、成员检测和标识号检测均为相同优先级,并具有如 比较运算 一节所描述的从左至右串连特性。
运算符 | 描述 |
---|---|
| 赋值表达式 |
lambda 表达式 | |
| 条件表达式 |
布尔逻辑或 OR | |
布尔逻辑与 AND | |
| 布尔逻辑非 NOT |
比较运算,包括成员检测和标识号检测 | |
| 按位或 OR |
| 按位异或 XOR |
| 按位与 AND |
| 移位 |
| 加和减 |
| 乘,矩阵乘,除,整除,取余 5 |
| 正,负,按位非 NOT |
| 乘方 6 |
| await 表达式 |
| 抽取,切片,调用,属性引用 |
| 绑定或加圆括号的表达式,列表显示,字典显示,集合显示 |
脚注
虽然 abs(x%y) < abs(y)
在数学中必为真,但对于浮点数而言,由于舍入的存在,其在数值上未必为真。 例如,假设在某个平台上的 Python 浮点数为一个 IEEE 754 双精度数值,为了使 -1e-100 % 1e100
具有与 1e100
相同的正负性,计算结果将是 -1e-100 + 1e100
,这在数值上正好等于 1e100
。 函数 math.fmod()
返回的结果则会具有与第一个参数相同的正负性,因此在这种情况下将返回 -1e-100
。 何种方式更适宜取决于具体的应用。
如果 x 恰好非常接近于 y 的整数倍,则由于舍入的存在 x//y
可能会比 (x-x%y)//y
大。 在这种情况下,Python 会返回后一个结果,以便保持令 divmod(x,y)[0] * y + x % y
尽量接近 x
.
Unicode 标准明确区分 码位 (例如 U+0041) 和 抽象字符 (例如 “大写拉丁字母 A”)。 虽然 Unicode 中的大多数抽象字符都只用一个码位来代表,但也存在一些抽象字符可使用由多个码位组成的序列来表示。 例如,抽象字符 “带有下加符的大写拉丁字母 C” 可以用 U+00C7 码位上的单个 预设字符 来表示,也可以用一个 U+0043 码位上的 基础字符 (大写拉丁字母 C) 加上一个 U+0327 码位上的 组合字符 (组合下加符) 组成的序列来表示。
对于字符串,比较运算符会按 Unicode 码位级别进行比较。 这可能会违反人类的直觉。 例如,"\u00C7" == "\u0043\u0327"
为 False
,虽然两个字符串都代表同一个抽象字符 “带有下加符的大写拉丁字母 C”。
要按抽象字符级别(即对人类来说更直观的方式)对字符串进行比较,应使用 unicodedata.normalize()
。
由于存在自动垃圾收集、空闲列表以及描述器的动态特性,你可能会注意到在特定情况下使用 is
运算符会出现看似不正常的行为,例如涉及到实例方法或常量之间的比较时就是如此。 更多信息请查看有关它们的文档。
%
运算符也被用于字符串格式化;在此场合下会使用同样的优先级。
幂运算符 **
绑定的紧密程度低于在其右侧的算术或按位一元运算符,也就是说 2**-1
为 0.5
。