Python 中的 and 运算符是否短路求值?

python 的 `and` 运算符支持短路求值:当左侧操作数为假时,右侧表达式不会被执行,从而避免潜在异常(如对 `none` 调用方法)。

在 Python 中,布尔运算符 and 和 or 都遵循短路求值(short-circuit evaluation)规则。这意味着表达式的求值会从左到右进行,且一旦结果已确定,后续子表达式将完全跳过执行

以你的示例为例:

if foo is not None and foo.passes_the_test():
    # do something
  • 若 foo is not None 为 False(即 foo 是 None),整个 and 表达式已确定为 False,Python 不会执行 foo.passes_the_test();
  • 因此,不会触发 AttributeError: 'NoneType' object has no attribute 'passes_the_test' 异常;
  • 只有当左侧为 True 时,右侧才会被求值——这正是安全访问属性或调用方法的常用惯用法。

✅ 正确用法(推荐):

if user and user.is_active and user.has_permission('edit'):
    edit_document()

即使 user 为 None 或 False,后续调用均被跳过,代码健壮。

⚠️ 注意事项:

  • 短路仅适用于 and/or,不适用于位运算符 &/|(它们总是计算两边,且要求操作数为整数或支持 __and__ 等协议);
  • 不要依赖短路来“隐藏”副作用——若右侧有重要逻辑(如日志、状态变更),应显式拆分为 if-elif 或使用惰性封装(如 lambda 或函数调用);
  • and 返回的是最后一个被求值的操作数,而非单纯 True/False。例如:0 and 'hello' 返回 0,'a' and [] 返回 [] —— 这在条件赋值中很有用(如 name = user.name and user.name.strip() or 'Anonymous',但更推荐用 or 配合 if 表达式)。

? 总结:Python 的 and 确保左侧为真后才执行右侧,是编写安全、简洁条件逻辑的核心机制。合理利用短路,可显著提升代码可读性与鲁棒性。