Python中判断对象相等用==(值相等),判断同一对象用is(身份相同);is比较内存地址,==调用__eq__方法比较逻辑值;None、True、False应用is判断,空容器宜用not而非is,浮点数比较应使用math.isclose()。
Python中判断两个对象是否“相等”或“是同一个”,关键在于分清 equality(值相等) 和 identity(身份相同)。它们对应不同的运算符和底层逻辑,用错会导致隐蔽的bug。
is 判断是否同一对象is 检查两个变量是否指向内存中的同一个对象——即它们的 id() 是否完全一致。这与对象内容无关,只看引用地址。
a = 100; b = 100; a is b 返回 True,但这属于实现细节,不应依赖None、True、False 是单例,推荐用 is 比较,如 if x is None:
is 也几乎总是 False,除非显式赋值同一引用,例如 b = a
== 判断值是否相等== 默认调用对象的 __eq__ 方法,用于比较逻辑意义上的“相等”。对内置类型有合理实现:数值比大小、列表比元素顺序和内容、字典比键值对等。
__eq__ 可定义“什么算相等”,比如按某个属性或多个字段判断a == b 为 True,一般也应让 b == a 成立;若 a == b 且 b == c,最好也满足 a == c
__eq__,默认继承自 object,此时 == 行为等同于 is(即只比身份)混淆 is 和 == 是新手高频错误。
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,但不能替代 == 做语义判断