You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python列表用'in'运算符查找对象:__eq__/__ne__未被调用问题咨询

关于Python列表中用in查找对象的问题

嘿,这个问题我之前踩过坑,来给你详细说清楚~

首先明确:完全可以用in运算符在Python列表中查找自定义对象,而且它确实会调用你实现的__eq__方法来做相等性判断——你觉得没触发,大概率是__eq__的实现有细节问题,咱们一步步来理。

in运算符的工作逻辑

当你执行obj in my_list时,Python会遍历列表中的每一个元素,依次执行obj == item(或者反过来,取决于哪个对象的__eq__被优先调用),只要有一个比较返回True,in就会返回True。也就是说,只要你的__eq__实现正确,它一定会被触发。

举个能正常触发__eq__的例子

比如我们定义一个简单的类,实现基于属性比较的__eq__:

class User:
    def __init__(self, user_id):
        self.user_id = user_id
    
    def __eq__(self, other):
        print("触发了__eq__方法!")
        # 一定要先判断对方是不是同类型实例,避免和其他类型比较出错
        if not isinstance(other, User):
            return False
        return self.user_id == other.user_id

然后测试:

user1 = User(100)
user2 = User(100)
user_list = [user1]

print(user2 in user_list)  # 会先打印"触发了__eq__方法!",然后输出True

为什么你的__eq__没触发?

如果你的代码里in没触发__eq__,可以检查这几个常见问题:

  • 没处理非同类实例的情况:比如你的__eq__直接访问other的属性,当other不是你定义的类的实例时,会抛出AttributeError,但如果列表里刚好有非同类元素,可能在遍历到它时出错,但你没捕获异常,误以为是没触发__eq__。
  • __eq__返回了非布尔值:比如你不小心在__eq__里返回了None或者其他值,Python会把它当作False,这时候in会继续遍历,你可能以为没触发,但其实是触发了但返回了无效值。
  • 混淆了==和is:in是用==判断相等性,而不是is判断身份。如果你误以为in会检查对象是否是同一个引用,那当你用另一个实例去查找时,即使属性相同,也会返回False,但这时候__eq__其实是触发了的,只是你的逻辑可能有问题。
  • __eq__方法写错了:比如拼写错误写成了__eq(少了下划线),或者方法签名不对(比如没写self和other参数)。

总结

只要你的__eq__方法实现正确(处理了类型判断、返回布尔值、签名正确),in运算符完全可以用来在列表中查找自定义对象,并且一定会触发你的__eq__方法。如果还是没触发,建议在__eq__里加个打印语句调试一下,看看是不是执行到了这个方法,以及返回值是什么。

内容的提问来源于stack exchange,提问作者Some Guy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:47:17