在Python里自定义可变类可以用作字典的键吗?

时间:2023-12-09 阅读:58 评论:0 作者:yc888

节点自定义对象从其类定义来看是可变的,

任何可变对象都不应该覆盖哈希方法的默认实现,

因为默认方法使用标识,

保证在对象的生命周期内是唯一且恒定的。 

这样做可能会导致对象的哈希值发生变化,

并可能导致很多问题。


例如:

        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


本文链接: http://a.10zhan.com/post/4298.html 转载请注明出处!