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

Python中判断自定义Node对象是否存在于set集合的问题

问题原因

Python的集合(set)判断元素是否存在时,会先通过__hash__方法计算元素的哈希值,再用__eq__方法比较元素是否相等。你定义的Node类没有重写这两个方法,默认使用对象的内存地址来生成哈希值和判断相等——哪怕两个Node实例的x、y属性完全相同,它们也是不同的对象,内存地址不同,所以set会把它们当成两个不同的元素,导致判断失败。

解决方案

重写Node类的__eq__和__hash__方法,让集合基于x和y的属性值来判断元素是否相同:

class Node:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __eq__(self, other):
        # 先判断other是否是Node实例
        if not isinstance(other, Node):
            return False
        # 比较x和y属性是否相等
        return self.x == other.x and self.y == other.y
    
    def __hash__(self):
        # 基于x和y生成哈希值,利用tuple的哈希实现(tuple是不可变类型)
        return hash((self.x, self.y))

修改后,再运行你的代码,currentNode in self.visited就会返回True——因为两个实例的x、y相同,哈希值一致且__eq__返回True,set会认为它们是同一个元素。

注意事项
  • 重写__eq__时必须同时重写__hash__,否则会破坏Python的哈希一致性规则(相等的对象必须有相同的哈希值),可能导致集合、字典等哈希表结构出现异常。
  • 用来生成哈希值的属性必须是不可变类型(比如int、str、tuple),如果x或y是可变类型(比如list),需要先转为不可变类型再参与哈希计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 07:06:32