核心要点
== 比较值相等,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。
回答思路
【定义】用一句话说清「Python 中 == 与 is」
【原理】讲清关键机制或步骤(2~3 点)
【例子】举一个真实项目、论文或产品中的例子
【对比】与易混淆概念或替代方案比较(如有)
【收尾】总结适用场景 + 一个局限或风险
常见误区
⚠️ 常见踩坑
用 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 明确推荐 is/is not 与 None 比较。
追问 2:numpy 数组能用 == 吗?
arr1 == arr2 返回逐元素布尔数组,不是单个 bool。整体相等用 np.array_equal 或 (arr1 == arr2).all()。is 仍比较对象身份。
追问 3:__eq__ 和 __hash__ 有什么关系?
若 a == b 则要求 hash(a) == hash(b)。定义 __eq__ 未定义 __hash__ 则类不可哈希。可变容器通常 __hash__ = None。
🔗 相似问题
同一考点的不同问法,换着练更稳
没找到想看的面试题?把你想看的告诉我们 →
延伸学习
按主题分类的相关资源,便于系统复习
