核心要点

  • == 比较值相等,is 比较对象身份(id)

  • 知道小整数/短字符串 intern 现象

  • None 判断必须用 is

简要回答

== 调用 eq 比较值是否相等;is 比较是否为同一对象(同一 id)。判断 None 用 is None,不要用 == None

标准回答

运算符 含义 触发
== 值相等 __eq__
is 身份相同(同一对象) 比较 id(a) == id(b)
python
a = [1, 2]
b = [1, 2]
a == b   # True,内容相同
a is b   # False,不同对象

x = None
x is None  # 推荐

陷阱:CPython 缓存小整数 [-5, 256],a = 256; b = 256; a is b 可能 True;a = 257; b = 257 通常 False。不要依赖 is 比较值相等

自定义类:可重写 __eq__;若重写 __eq__ 且想可哈希,须实现一致的 __hash__ 或设 __hash__ = None

常见误区

⚠️ 常见踩坑

is 比较字符串或数字是否「相等」;if x == True 应写 if x is Trueif x

追问

追问 1为什么 `if x is None` 优于 `if x == None`?

is None 比较对象身份,更快且语义明确。== None 会调用 x.__eq__,可能被重载产生意外结果;PEP 8 规定与 None 比较统一用 is / is not

追问 2numpy 数组能用 == 吗?

题库专题:如何将 NumPy 数组转换为 PyTorch 张量?

能,但 arr1 == arr2 返回的是逐元素比较的布尔数组,不是单个 bool。直接放进 if 会抛 'ambiguous truth value',需用 (arr1 == arr2).all()np.array_equal(arr1, arr2);浮点比较还要用 np.allclose 容忍误差。

题库延伸:与本追问相关的专题题 → 如何将 NumPy 数组转换为 PyTorch 张量?

追问 3__eq__ 和 __hash__ 有什么关系?

约定:a == b 为真则 hash(a) 必须等于 hash(b),否则 dict/set 会失效。一旦自定义 eq,Python 会把 hash 置为 None 使实例不可哈希——若仍想作键,须同时实现一致的 hash(通常基于参与 eq 的同一组不可变字段)。dataclass(frozen=True) 会帮你自动生成这对一致的方法。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。