应使用 is None 而不是 == None,因为 None 是单例对象,is 比较内存地址、语义准确且不可被重载;== 会调用可被自定义的 eq 方法,导致误判,且 PEP 8 明确禁止用 == 比较 None。

为什么 is None 比 == None 更安全
因为 None 是单例对象,所有 None 都指向同一内存地址;is 做的是身份比较(id(a) == id(b)),结果确定、不可被干扰。== 则调用 __eq__ 方法,而该方法可被任意类重载——哪怕一个自定义对象根本不是 None,也能让 obj == None 返回 True。
常见误判示例:
class AlwaysTrue:
def __eq__(self, other):
return True
<p>t = AlwaysTrue()
print(t is None) # False
print(t == None) # True ← 完全违背直觉</p>
if not x 和 x is None 完全不是一回事
新手常以为“空就是 None”,但 Python 中的假值(Falsy)有整整六种:None、False、0、""、[]、{}。用 if not x 会把 0 或空字符串也当作“空”处理,而它们和 None 语义完全不同。
- 数据库字段缺失 → 通常为
None - 用户输入了 "0" → 字符串
"0"是真值,但转成整数后是0,if not 0会误判为“空” - API 返回空列表
[]→ 表示“有数据但为空集合”,不等于“未返回”或“字段缺失”
PEP 8 明确禁止 == None
官方风格指南 PEP 8 写得非常直白:“Comparisons to singletons like None should always be done with is or is not, never the equality operators.” 这不是建议,是规范。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
实际影响包括:
-
mypy等类型检查器在看到x == None时,无法准确推断后续分支中x的类型是否为None - 某些静态分析工具(如
pylint)会直接报C0121警告 - 团队代码审查中,
== None几乎总会被要求修改
第三方库返回的“空”未必是 None
别假设数据库驱动、ORM、JSON 解析器或 HTTP 客户端一定用 None 表示缺失值。比如:
-
psycopg2从 PostgreSQL 读取NULL字段 → 返回None -
sqlite3某些版本对 BLOB 字段为 NULL 时可能返回b''而非None -
requests的response.json()遇到空响应体可能抛异常,而不是返回None - Pandas 的
NaN和None在多数操作中可互换,但pd.NA is None是False
真正关键的不是“怎么写判断”,而是“先查文档确认它到底返回什么”。is None 只对真正的 None 有效,对其他空值类型无效——这点最容易被忽略。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










