
Python 的 and 运算符并非只返回 True 或 False,而是采用“短路求值+原值返回”策略:先计算左操作数,若为假值(如 0、None、空容器等)则直接返回它;否则返回右操作数的原始值。因此 13 and 9 的结果是 9,而非 True。
python 的 `and` 运算符并非只返回 `true` 或 `false`,而是采用“短路求值+原值返回”策略:先计算左操作数,若为假值(如 `0`、`none`、空容器等)则直接返回它;否则返回右操作数的原始值。因此 `13 and 9` 的结果是 `9`,而非 `true`。
在 Python 中,and 和 or 是逻辑运算符,但它们的行为与许多其他语言(如 C、Java)有本质区别:它们不强制将操作数转换为布尔值后再返回 True/False,而是直接返回参与运算的实际对象——这一设计支持链式赋值、默认值处理等惯用法,是 Python “实用优先”哲学的典型体现。
运算规则精要
x and y 的执行逻辑如下:
- 求值 x;
- 若 x 为假值(falsy)(例如 0、False、None、""、[]、{} 等),立即返回 x(不计算 y);
- 若 x 为真值(truthy)(即非 falsy 的任意对象,如 13、"hello"、[1]),则求值并返回 y。
同理,x or y 返回第一个真值,或最后一个假值。
实例解析
>>> 13 and 9 9 >>> 0 and 9 0 >>> [] and "hello" [] >>> "Python" and [1, 2] [1, 2] >>> None and 42 None
注意:13 and 9 返回 9,不是因为 9 是“更真”,而是因为 13 是 truthy,所以表达式自然落到返回 y(即 9)这一步。
立即学习“Python免费学习笔记(深入)”;
常见用途与最佳实践
-
✅ 提供默认值(比 if-else 更简洁):
name = user_input and user_input.strip() or "Anonymous" # 更推荐使用条件表达式(更清晰): name = user_input.strip() if user_input else "Anonymous"
-
✅ 安全访问嵌套属性(避免 AttributeError):
# 假设 data 可能为 None value = data and data.get("config") and data["config"].get("timeout") -
⚠️ 切勿用于布尔判断场景:
# ❌ 错误:期望 bool,却得到 int if some_list and some_dict: # 返回的是 list/dict 对象,虽可隐式转 bool,但语义模糊 process() # ✅ 推荐:显式、清晰、意图明确 if some_list and some_dict: # ✅ 实际可行(因容器本身支持布尔上下文) process() # 或更明确地: if bool(some_list) and bool(some_dict): process()
关键注意事项
- and/or 的返回值类型不固定:可能是整数、字符串、列表、None 等任意类型,取决于操作数;
- 所有 falsy 值在布尔上下文中为 False,但它们彼此不相等(如 0 == False 为 True,但 [] == False 为 False);
- 性能上,短路特性可避免不必要的计算(如 expensive_func() and cache_result 中,若前者为 falsy,则后者不执行)。
掌握 and/or 的原值返回机制,不仅能正确解读 13 and 9 为何得 9,更能写出更 Pythonic、高效且富有表现力的代码。


















