Python中判断对象相等用==(值相等),判断同一对象用is(身份相同);is比较内存地址,==调用__eq__方法比较逻辑值;None、True、False应用is判断,空容器宜用not而非is,浮点数比较应使用math.isclose()。

Python中判断两个对象是否“相等”或“是同一个”,关键在于分清 equality(值相等) 和 identity(身份相同)。它们对应不同的运算符和底层逻辑,用错会导致隐蔽的bug。
identity:用 is 判断是否同一对象
is 检查两个变量是否指向内存中的同一个对象——即它们的 id() 是否完全一致。这与对象内容无关,只看引用地址。
- 小整数(-5 到 256)和短字符串常量在CPython中会被缓存,所以
a = 100; b = 100; a is b返回True,但这属于实现细节,不应依赖 -
None、True、False是单例,推荐用is比较,如if x is None: - 自定义对象即使内容完全一样,
is也几乎总是False,除非显式赋值同一引用,例如b = a
equality:用 == 判断值是否相等
== 默认调用对象的 __eq__ 方法,用于比较逻辑意义上的“相等”。对内置类型有合理实现:数值比大小、列表比元素顺序和内容、字典比键值对等。
- 可重载:在自定义类中实现
__eq__可定义“什么算相等”,比如按某个属性或多个字段判断 - 注意对称性:若
a == b为True,一般也应让b == a成立;若a == b且b == c,最好也满足a == c - 若未定义
__eq__,默认继承自object,此时==行为等同于is(即只比身份)
常见误用场景与建议
混淆 is 和 == 是新手高频错误。
立即学习“Python免费学习笔记(深入)”;
- 检查空列表或空字符串时,写
if my_list == []:或if not my_list:更清晰安全;避免if my_list is []:(永远为False,因为每次[]都新建对象) - 浮点数比较慎用
==,因精度问题;需用math.isclose();而is对浮点数几乎无意义 - 函数返回值为
None时,统一用is None,而非== None(后者可能被自定义类意外重载)
快速验证方法
调试时可用这两行快速区分:
-
print(id(a), id(b))看地址是否一致 → 对应is -
print(a == b, a.__eq__(b))看值比较逻辑 → 对应== - 对不可变对象(如
int,str),is有时碰巧为True,但不能替代==做语义判断










