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
相关产品推荐
相关产品推荐

