Python对象比较教程_equality与identity区别

12次阅读

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

Python对象比较教程_equality与identity区别

Python中判断两个对象是否“相等”或“是同一个”,关键在于分清 equality(值相等)identity(身份相同)。它们对应不同的运算符和底层逻辑,用错会导致隐蔽的bug

identity:用 is 判断是否同一对象

is 检查两个变量是否指向内存中的同一个对象——即它们的 id() 是否完全一致。这与对象内容无关,只看引用地址。

  • 小整数(-5 到 256)和短字符串常量在CPython中会被缓存,所以 a = 100; b = 100; a is b 返回 True,但这属于实现细节,不应依赖
  • NoneTrueFalse 是单例,推荐用 is 比较,如 if x is None:
  • 自定义对象即使内容完全一样,is 也几乎总是 False,除非显式赋值同一引用,例如 b = a

equality:用 == 判断值是否相等

== 默认调用对象的 __eq__ 方法,用于比较逻辑意义上的“相等”。对内置类型有合理实现:数值比大小、列表比元素顺序和内容、字典比键值对等。

  • 可重载:在自定义类中实现 __eq__ 可定义“什么算相等”,比如按某个属性或多个字段判断
  • 注意对称性:若 a == bTrue,一般也应让 b == a 成立;若 a == bb == 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,但不能替代 == 做语义判断
text=ZqhQzanResources