None 和 False 类型不同、语义不同,因此 None == False 为 False;它们仅在布尔上下文中同为 falsy,但相等性比较不等价。
因为 None 和 False 是**不同类型、不同语义的值**,Python 的布尔比较(==)默认做的是“值相等”判断,而非“真值等价”。它们在布尔上下文中都为假(bool(None) is False,bool(False) is False),但这不意味着它们相等。
None 是一个单例对象,表示“无值”“空缺”或“未返回”,常用于函数无显式返回、可选参数未传入、占位等场景;False 是布尔类型的两个实例之一,明确表示逻辑假。Python 不会把语义上无关的“假值”自动等同——就像 0、空字符串 ""、空列表 [] 也都为假,但 0 == "" 或 [] == False 同样是 False。
Python 中 == 调用对象的 __eq__ 方法。对于 None,它的 __eq__ 只对另一个 None 返回 True;对于 False(属于 bool,是 int 子类),它和 0 相等(False == 0 为 True),但和 None 无特殊约定,因此返回 NotImplemented,最终回退为 False。
None == None → True(同一单例)False == 0 → True(bool 继承自 int)None == False → False(类型不同,无隐式转换)Python 明确区分:
bool(x),用于条件语句。所有“falsy 值”(None, False, 0, "", [], {} 等)在此上下文中都被视为假。x.__eq__(y),关注具体值与类型是否匹配,不自动跨语义归约。if x: 和写 if x == False: 完全不是一回事:if []: 不执行(因为空列表是 falsy),但 [] == False 是 False;if None: 也不执行,但 None == False 仍是 False。
按需选择清晰、安全的写法:
None:用 is None(推荐),因为 None 是单例,is 快且语义准确 —— x is None
if not x:(但注意这会把 0、"" 等也包含进来)False(且不是其他 falsy 值):用 x is False 或 x == False(后者在多数情况可行,但 is 更精确)if x == False: 代替 if not x:,除非你真的只关心 False 这个对象。