Python 中 not 是低优先级逻辑运算符,not zz * 4 实际被解析为 not (zz * 4) 而非 (not zz) * 4,导致布尔值未参与乘法;而显式布尔字面量(如 True * 4)则直接触发 int.__mul__ 返回整数结果。
python 中 `not` 是低优先级逻辑运算符,`not zz * 4` 实际被解析为 `not (zz * 4)` 而非 `(not zz) * 4`,导致布尔值未参与乘法;而显式布尔字面量(如 `true * 4`)则直接触发 `int.__mul__` 返回整数结果。
在 Python 中,bool 是 int 的子类(issubclass(bool, int) 返回 True),因此布尔值天然支持算术运算:True == 1、False == 0,且 True * 4 等价于 1 * 4,结果为 4。这一设计让布尔值可安全用于数值上下文,但真正引发困惑的并非乘法本身,而是 not 运算符的优先级远低于算术运算符。
根据 Python 官方运算符优先级表,not 属于“布尔否定”层级,排在乘法 *、加法 +、比较运算符等之后。这意味着:
zz = 0 not zz * 4 # ❌ 等价于 not (zz * 4) → not (0) → True
而非直觉上的 (not zz) * 4(即 True * 4 → 4)。
这是因为解析器先执行高优先级的 *,再应用 not。同理,not zz + 1 会被解析为 not (zz + 1),而非 (not zz) + 1。
✅ 正确写法必须使用括号明确分组:
(not zz) * 4 # ✅ 结果为 4 (not zz) + 1 # ✅ 结果为 2(True + 1 → 1 + 1)
⚠️ 注意事项:
- not 返回的是 bool 类型对象(True/False),而 bool * int 触发 bool.__mul__(继承自 int),返回 int;
- 但若 not 作用于算术表达式(如 not (a * b)),结果恒为 bool,无法直接参与后续数值计算;
- 此行为在所有 Python 3.x 版本中一致,属于语言规范而非 bug,文档明确位于 Expressions — Operator precedence。
总结:遇到 not 与算术运算混用时,务必加括号。这不是“罕见 gotcha”,而是优先级规则的必然体现——养成 not (...) 的书写习惯,可彻底规避此类隐式类型与逻辑歧义。