Lazy loaded image
Python的奇妙短路逻辑与运算符优先级
字数 1306阅读时长 4 分钟
2025-9-27
2025-9-27

Python 短路逻辑与运算符优先级详解

💡
有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
在 Python 中,andornot 这三个逻辑运算符的行为常常让人困惑,尤其是当它们组合在一起时。本文将紧扣题目代码不超纲一步步解释为什么程序会输出这些结果,帮助你真正理解背后的规则。

一、必须掌握的三条基础规则

规则1:真假值判断(仅本题涉及)

  • 假值(falsy)0False
  • 真值(truthy):除假值外的所有值,如 1345……都是真
✅ 本题只用到数字和布尔值,无需考虑空字符串、空列表等。

规则2:andor 返回的是“原值”,不是 True/False

这是最容易出错的地方!
  • A and B
    • 如果 A → 结果 = A(不再计算 B,称为“短路”)
    • 如果 A → 结果 = B
  • A or B
    • 如果 A → 结果 = A(短路,不看 B)
    • 如果 A → 结果 = B
✅ 记住:返回的是参与运算的那个实际值,比如 3 and 4 返回 4,不是 True

规则3:运算符优先级(从高到低)

  • 先算所有 not
  • 再算所有 and
  • 最后算 or
如果有括号 ( ),则先算括号内的内容,优先级最高。

二、逐行解析题目代码

第1行:带括号的表达式

因为有括号,每个部分独立计算:
  1. (not 1)1 是真 → not 1 = False
  1. (0 and 1)0 是假 → 结果 = 0(短路)
  1. (3 and 4)3 是真 → 结果 = 4
  1. (5 and 6)5 是真 → 结果 = 6
  1. (7 and 8 and 9)
      • 先算 7 and 87 真 → 得 8
      • 再算 8 and 98 真 → 得 9
现在整个表达式变成:
or 从左到右计算:
  • False or 0False 是假 → 结果 = 0
  • 0 or 40 是假 → 结果 = 4
  • 后面不再计算(因为 4 是真,or 遇真即停)
输出:4

验证基础规则的几行

输出依次为:
完全符合规则2。

第2个关键表达式:无括号

没有括号! 必须按优先级计算。

步骤1:先算 not

  • not 1False
表达式变为:

步骤2:再算所有 and(从左到右)

  • 0 and 10
  • 3 and 44
  • 5 and 66
  • 7 and 8 and 97 and 8 = 88 and 9 = 9
现在变成:

步骤3:最后算 or(从左到右)

  • False or 00
  • 0 or 44(短路,停止)
输出:4
💡 为什么和有括号的结果一样?
因为在这个特定例子中,括号分组和优先级分组恰好得到相同的子表达式。但这只是巧合! 换一个例子可能就不同了。

最后几行:综合练习

重点看这行:
按优先级逐步计算:
  1. 先算 notnot 22 是真 → 结果 = False
  1. 再算 and1 and False1 是真 → 结果 = False
  1. 最后算 or0 or False0 是假 → 结果 = False
✅ 输出:False
最后一行:

三、为什么会出现这些结果?——核心原因总结

  1. 短路求值
      • and 一旦遇到假值就立即返回它,不再往后看
      • or 一旦遇到真值就立即返回它,不再往后看
  1. 返回原值,不是布尔值
      • 3 and 4 返回 4,不是 True
      • 这是 Python 的设计特点,也是很多初学者误解的根源
  1. 优先级决定计算顺序
      • 没有括号时,not 先算,and 次之,or 最后
      • 有括号时,括号内优先
  1. 从左到右结合
      • 相同优先级的运算符(如多个 or)从左往右依次计算

四、一句话记住

not 最急,and 次之,or 最慢;and 怕假,or 爱真;返回原值,不是真假。
只要掌握这三条规则,你就能准确预测任何类似表达式的结果,不再“猜输出”!
上一篇
函数文档、类型注释、内省 - Python
下一篇
Apache Hudi 安装与配置文档

评论
Loading...