节点自定义对象从其类定义来看是可变的,
任何可变对象都不应该覆盖哈希方法的默认实现,
因为默认方法使用标识,
保证在对象的生命周期内是唯一且恒定的。
这样做可能会导致对象的哈希值发生变化,
并可能导致很多问题。
例如:
Node node = new Node(5, None, None) cache = {} cache[node] = "Node added"node.val = 5
但我们可以继续重写不可变对象的哈希方法。
这个帖子的回答帮助我理解了它是如何工作的。
接下来,我们假设 Node 对象的属性一旦创建就永远不会改变。
这里的想法是确保您的自定义对象实现哈希和相等方法。
相等方法应该以这样的方式实现:两个逻辑相等的对象始终被认为是相等的。
对于此处给定的 Node 对象,
如果两个节点的所有属性都相同,
则它们将被视为相等。
所以我们可以构建一个键,
它是所有属性的元组。
这是有效的,因为元组是不可变的,
所以我们基本上创建一个包含该对象的所有属性的不可变对象,
并将使用它来计算哈希。
以下实现确保两个逻辑上等效的节点(具有相同的属性)具有相同的密钥,
因此将为两个相等的节点生成相同的哈希值。
class Node: def __init__(self, val, next, random): self.val = val self.next = next self.random = random def __key(self): return (self.val, self.next, self.random) def __hash__(self): return hash(self.__key()) def __eq__(self, other): if isinstance(other, Node): return self.__key() == other.__key() return NotImplemented