and和or的短路效应是python语言规范强制要求的从左到右求值行为,一旦确定结果即停止后续计算,返回原始操作数而非布尔值,直接影响副作用执行。

and 和 or 产生短路效应,是因为 Python 明确规定它们必须**从左到右求值,且一旦能确定整个表达式的真假结果,就立即停止后续计算**——这不是优化技巧,而是语言规范强制行为。
短路是语言设计的硬性规则,不是运行时优化
Python 文档(Boolean Operations)写明:and 和 or 是“择一返回”运算符,其求值过程严格按顺序、带终止条件:
-
x and y:先求x;若x为 falsy(如None、0、[]、""),直接返回x,y根本不执行 -
x or y:先求x;若x为 truthy(如非零数、非空字符串、非空列表),直接返回x,y被跳过
这意味着 print("left") and print("right") 永远只输出 left;而 print("left") or print("right") 也只输出 left。这不是“可能省掉”,而是“必然不执行”。
短路直接决定哪些代码会被执行
副作用(比如函数调用、IO、赋值)是否发生,完全取决于短路路径:
-
user and user.get_profile():若user为None,get_profile()不会调用,避免AttributeError -
config.get("timeout") or 30:若get()返回0(合法但 falsy),30会被误用——这不是 bug,而是短路逻辑的自然结果 -
data = db.query() or fallback_data():只要db.query()返回 falsy 值(哪怕查询成功但结果为空列表),fallback_data()就会触发
and/or 混合时优先级容易误导人
很多人误以为 a or b and c 是从左到右平级执行,实际它等价于 a or (b and c),因为 and 优先级高于 or:
-
False or True and False→ 先算True and False得False,再算False or False→ 结果是False -
False or [] and "ok"→[]是 falsy,[] and "ok"返回[],最终False or []返回[] - 想表达 “(a or b) and c”,必须加括号,否则逻辑被优先级改写
返回值不是布尔型,而是原始操作数
这是最容易忽略的底层事实:and 和 or **从不返回 True 或 False**,它们返回参与运算的某个操作数本身:
-
0 and "hello"→ 返回0,不是False -
"" or [1, 2]→ 返回[1, 2],不是True -
None or 42→ 返回42,不是True
这意味着你不能假设 if x or y: 中的 x or y 是布尔值——它可能是数字、列表、字符串甚至 None。判断逻辑是否成立,靠的是它的 truthiness,但变量本身保留原始类型和值。
and/or 右侧,它的执行与否就不再由你控制,而由左侧值的真假性决定——这点在调试和重构时特别容易翻车。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











