判断None必须用is而非==或if not x,因None是单例且语义为“无值”;==可能被重载误判,if not x会错误过滤0、''等合法假值。

None 判断必须用 is,不用 ==
Python 里 None 是单例对象,语义上表示“无值”,不是“空”或“假”。用 == 虽然多数时候能蒙对,但存在被重载的风险——比如自定义类实现了 __eq__ 返回 True 给 None,就会误判。
真值测试(if x:)更危险:它会把 0、''、[]、{} 全部当成假,完全偏离“是否为 None”的本意。
- ✅ 正确写法:
if x is None:或if x is not None: - ❌ 错误写法:
if x == None:(不安全)、if not x:(逻辑错位) - ⚠️ 特殊情况:
numpy.nan、pandas.NA都不等于None,也不能用is判断,得用pd.isna(x)或np.isnan(x)
if x: 测的是真值(truthiness),不是空值
这个判断触发的是 Python 的“真值测试”协议,本质调用 bool(x)。它只关心对象是否“被认为是真的”,和“有没有值”无关。很多非空对象也会返回 False,比如数值 0、空容器、False 本身。
- 常见被误认为“空”但实际不是
None的假值:0、0.0、''、[]、{}、set() - 反例:一个含
None的列表[None]是真值(非空容器),但里面元素是None—— 真值测试完全无法反映这点 - 适用场景:仅当你确实想筛掉所有“逻辑假”值(如配置未开启、开关关闭)时才用
if x:
函数参数默认值为 None 时的典型误用
这是最常踩坑的地方:用 if not x: 处理可选参数,结果把 0、False、空字符串等合法输入也过滤掉了。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- ❌ 危险模式:
def func(x=None): if not x: x = 'default'→func(0)会覆盖成'default' - ✅ 安全模式:
def func(x=None): if x is None: x = 'default' - ? 进阶提示:如果允许
False或0作为有效输入,又想区分“未传参”和“传了假值”,None就是最干净的哨兵值 —— 但必须用is判
类型检查工具(如 mypy)对 None 的提示很关键
运行时靠写对逻辑,静态检查靠类型标注提前暴露问题。mypy 默认不认为变量可能为 None,除非你显式声明 Optional 或联合类型。
- 没标注时:
def f(x: str) -> str:,传入None会被 mypy 报错,但运行时可能只在深处分支才崩 - 正确标注:
def f(x: Optional[str]) -> str:,然后必须在函数内做if x is not None:分支处理 - ⚠️ 容易忽略:即使你写了
if x is not None:,mypy 也不会自动推断后续代码块中x非空 —— 得用assert x is not None或cast显式告知
if not x:,一顺手就套到 None 上,结果在 0 和 False 进来时悄悄出错 —— 这种 bug 最难复现,因为只在特定输入下失效。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










