核心要点
== 比较值相等,is 比较对象身份(id)
知道小整数/短字符串 intern 现象
None 判断必须用 is
简要回答
== 调用 eq 比较值是否相等;is 比较是否为同一对象(同一 id)。判断 None 用 is None,不要用 == None。
标准回答
| 运算符 | 含义 | 触发 |
|---|---|---|
== |
值相等 | __eq__ |
is |
身份相同(同一对象) | 比较 id(a) == id(b) |
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 True 或 if x。
追问
追问 1:为什么 `if x is None` 优于 `if x == None`?
is None 比较对象身份,更快且语义明确。== None 会调用 x.__eq__,可能被重载产生意外结果;PEP 8 规定与 None 比较统一用 is / is not。
追问 2:numpy 数组能用 == 吗?
题库专题:如何将 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) 会帮你自动生成这对一致的方法。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。
📰 AI 资讯
🛠️ AI 工具
- Pytorch
Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出