Python:可以将自定义类用作字典的键吗? [重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python:可以将自定义类用作字典的键吗? [重复]相关的知识,希望对你有一定的参考价值。
此问题已经在这里有了答案:
假设我们有一个这样的自定义节点类:
class Node:
def __init__(self, val, next, random):
self.val = val
self.next = next
self.random = random
节点对象可以用作字典的键吗?我的理解是,对象应具有可变性和可哈希性,以使其有资格用作字典键,因为可变对象会导致哈希值变化,但该对象是可变的,因此不应用作键。可以将自定义可变类用作字典的键吗?答案似乎是肯定的,所以正确的问题是如何?
答案
this线程上的答案帮助我了解了它的工作原理。
这里的想法是确保您的自定义对象实现哈希和相等方法。
Equal方法应以始终将两个逻辑等效对象视为相等的方式实现。对于此处给定的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
[请注意,如果节点的任何属性发生更改,则它基本上会变成其他节点,并且很可能会导致不同的哈希值。我说的可能性最大,因为两个不同的节点最终可能具有相同的哈希值,所以这种现象称为哈希冲突。上面引用的链接具有相同的更多信息。
以上是关于Python:可以将自定义类用作字典的键吗? [重复]的主要内容,如果未能解决你的问题,请参考以下文章