应使用 is 而不是 == 判断 none,因为 none 是单例对象,is 进行身份比较安全可靠,而 == 可被重载导致误判,且 pep 8 明确要求用 is none 或 is not none。

判断一个变量是否为 None,应始终使用 is 而不是 ==。这是 Python 官方推荐、语义清晰且安全的做法。
为什么必须用 is 判断 None
None 是单例对象,在整个 Python 运行时中只存在一个实例。因此,判断“是不是 None”本质是判断“是否指向同一个对象”,这正是 is 的语义——身份比较(identity),而非值比较(equality)。
而 == 可被任意类型重载,存在被意外覆盖的风险:
- 若某类自定义了
__eq__方法并返回True(哪怕逻辑上不合理),x == None就可能为真,造成误判; - 例如:
class BadClass: __eq__ = lambda self, other: True,此时BadClass() == None返回True,但显然它不是None; -
is无法被重载,永远只比较对象身份,安全可靠。
PEP 8 明确规定:用 is None
Python 官方编码规范 PEP 8 明确指出:
立即学习“Python免费学习笔记(深入)”;
“Comparisons to singletons like None should always be done withis or is not, never the equality operators.”
这意味着不仅 if x == None: 不合规,if x != None: 同样不合规,应统一写成:
if x is None:if x is not None:
常见误区与反例
以下写法虽可能“运行通过”,但属于错误实践:
-
if x == None:—— 违反 PEP 8,有安全隐患; -
if not x:—— 错误!会把0、''、[]、False等 falsy 值一并误判为None; -
if x is None or x == []:—— 混淆语义,应拆开独立判断或用更明确的逻辑表达意图。
实际应用建议
在函数参数默认值、API 返回值、配置项读取等场景中,常需显式区分 None 和其他值:
- 函数中检查可选参数:
def func(name=None): if name is not None: ... - 处理外部数据(如 JSON 解析结果):
data.get('user') is None比not data.get('user')更精准; - 类型提示中配合使用:
Optional[str]表示可能是str或None,运行时仍需用is None判断。










