必须用 is None,因为None是单例对象,is进行身份比较速度快且语义准确;==是值比较,可能被重载导致意外结果,且not x无法区分None与其他假值。

用 is 运算符判断,而不是 ==。
为什么必须用 is None
None 是单例对象,Python 中所有 None 都指向同一内存地址。用 is 是身份比较,速度快且语义准确;而 == 是值比较,可能被自定义类重载,导致意外结果。
-
None == None是True,但这是巧合,不是设计保证 -
0 == None、"" == None、False == None全是False,看似安全,但依赖隐式转换逻辑 - 若某变量是自定义类实例且实现了
__eq__,x == None可能返回True(虽然不推荐,但可能发生)
常见误判场景对比
以下表达式都返回 False,但它们的“假值”本质不同:
-
not None→True(None是假值) -
not ""→True(空字符串也是假值) -
not 0→True(数字 0 也是假值) -
not False→True(布尔假值)
所以仅靠 if not x: 无法区分它们——它只说明 x 是“falsy”,不等于“是 None”。
正确写法与反例
✅ 正确(推荐):
if x is None:
print("x 确实是 None")
❌ 错误(不推荐):
-
if x == None:—— 不符合 PEP 8,且有潜在风险 -
if not x:—— 会把""、0、[]、False全当成None -
if x is not False and not x:—— 逻辑混乱,仍无法排除0或""
需要同时处理 None 和其他空值?明确写出来
如果业务上想把 None、空字符串、空列表等统一视为空,那就显式列出:
if x is None or x == "" or x == [] or x == {}:
print("x 是空或未设置")
或者更简洁安全地:
if x in (None, "", [], {}, (), set()):
print("x 属于预设的空值集合")
注意:不要用 if not x 代替,因为像 [0]、"0"、1 这些非空值在布尔上下文中也可能是真,但你可能并不想忽略它们。










