and和or返回操作数本身而非true/false:a and b在a真时返b、否则返a;a or b在a真时返a、否则返b;具短路特性,且and优先级高于or。

and 和 or 不返回 True/False,而是返回操作数本身
很多人以为 and 和 or 只做逻辑判断、最终输出布尔值,其实不然。它们返回的是参与运算的**实际值**——可能是数字、字符串、列表、None,甚至函数调用结果。
关键规则如下:
- a and b:若 a 是真值(truthy),返回 b;否则返回 a
- a or b:若 a 是真值,返回 a;否则返回 b
所谓“真值”,指在布尔上下文中为 True 的值:非零数字、非空容器(如 [1]、"a")、非 None、非 False;反之,0、""、[]、{}、None 等都算假值(falsy)。
例如:
立即学习“Python免费学习笔记(深入)”;
-
5 and "hello"→"hello"(5 是真值,返回右边) -
[] and "fallback"→[](空列表是假值,直接返回左边) -
0 or "default"→"default"(0 是假值,返回右边) -
"user" or None→"user"(字符串是真值,返回左边)
短路求值:从左到右,结果确定即停止
Python 的 and 和 or 具有短路特性:表达式从左向右逐个求值,一旦能确定整个结果,就不再计算后续部分。
这不仅影响性能,更直接影响副作用是否发生——比如函数调用、打印、变量修改等。
-
func_a() and func_b():若func_a()返回假值(如None或0),func_b()根本不会执行 -
func_c() or func_d():若func_c()返回真值(如"ok"),func_d()就被跳过
典型安全用法:
-
if my_list and my_list[0] > 10:—— 避免空列表索引错误 -
result = obj and obj.get_name()—— 防止对 None 调用方法
优先级与嵌套:and 比 or 先算,括号决定逻辑清晰度
在混合表达式中,and 的优先级高于 or,相当于数学里的乘除先于加减。
例如:a or b and c 等价于 a or (b and c),不是 (a or b) and c。
不加括号容易出错,尤其当值类型混杂时:
-
0 or 5 and []→ 先算5 and []得[],再算0 or []得[] -
(0 or 5) and []→ 先算括号得5,再算5 and []得[](结果相同但逻辑不同) -
1 and 2 or 3 and 4→ 实际是(1 and 2) or (3 and 4)→2 or 4→2
建议:只要涉及多个 and/or,一律用括号明确意图,别依赖默认优先级。
实用技巧:用 and/or 替代 if-else 简化代码
利用它们返回操作数的特性,可以写出简洁又安全的默认值、条件赋值逻辑。
- 设置默认值:
name = user_input or "anonymous" - 链式安全访问:
value = data and data.get("config") and data["config"].get("timeout") - 避免重复计算:
result = expensive_check() and process_if_ok()(仅当检查通过才处理)
注意:这些写法可读性高,但不宜过度嵌套。超过两层 and/or 时,建议改用 if-elif-else 或提前返回,保证逻辑清晰。









