• 6.16. 运算符优先级

    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