- 6.16. 运算符优先级
6.16. 运算符优先级
下表对 Python 中运算符的优先顺序进行了总结,从最低优先级(最后绑定)到最高优先级(最先绑定)。 相同单元格内的运算符具有相同优先级。 除非句法显式地给出,否则运算符均指二元运算。 相同单元格内的运算符均从左至右分组(除了幂运算是从右至左分组)。
请注意比较、成员检测和标识号检测均为相同优先级,并具有如 比较运算 一节所描述的从左至右串连特性。
运算符 | 描述 |
---|---|
:= | 赋值表达式 |
lambda | lambda 表达式 |
if — else | 条件表达式 |
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
-1
为0.5
。