冒险契约
53.65M · 2026-02-28
if x: 到底在判断什么?在 Python 中我们经常写:
if x:
...
很多人会下意识认为这是在判断:
if x is not None:
但这其实是一个误解。
本文将系统讲清楚:
if x: 的真实机制__bool__ 与 __len__ 的优先级严格来说:
if x:
等价于:
if bool(x):
Python 会对对象执行一次 **真值测试(Truth Value Testing)**。
当 Python 执行:
if x:
内部流程如下:
__bool__()调用:
x.__bool__()
True 或 False__len__()调用:
x.__len__()
默认返回 True
以下对象在 if x: 中会被视为 False:
| 类型 | 示例 |
|---|---|
| None | None |
| 布尔 | False |
| 数值 | 0,0.0,0j |
| 空字符串 | '' |
| 空容器 | [],{},set(),range(0) |
例如:
if []:
print("True")
else:
print("False")
输出:
False
因为:
len([]) == 0
__bool__class A:
def __bool__(self):
return False
if A():
print("True")
else:
print("False")
输出:
False
__len__class B:
def __len__(self):
return 0
if B():
print("True")
else:
print("False")
输出:
False
if x 等价于 if x is not None错误示例:
x = 0
if x:
print("进入分支")
不会进入分支。
但:
if x is not None:
会进入。
因为:
0 不是 Nonebool(0) 为 False在科学计算或强化学习中经常会遇到:
import numpy as np
x = np.array([1, 2, 3])
if x:
...
会报错:
ValueError: The truth value of an array with more than one element is ambiguous
为什么?
因为数组有多个元素,Python 不知道你是想:
正确写法应该是:
if x.any():
或
if x.all():
在 JAX 中也是同样的设计。
Python 的哲学是:
这种设计使得代码非常简洁:
if users:
process(users)
而不需要写:
if len(users) > 0:
永远写:
if x is None:
或
if x is not None:
不要用:
if not x:
可以安全写:
if my_list:
if loss:
如果 loss 可能为 0,会产生逻辑错误。
if x: 本质是:
bool(x)
其行为由:
__bool____len__决定。
理解这一点可以避免:
win11U盘无法弹出怎么办
[开源分享] Agent 指挥 Agent,我做了一个让 Claude Code / Codex / Gemini/... 组成"军团"并行干活的工具
2026-02-28
2026-02-28