Python:键类型在字典中应该是不可变的,但为什么我可以让节点类的实例成为键?

时间:2014-08-07 21:28:35

标签: python dictionary

无论python中的字典还是Java中的哈希映射,密钥都可以是节点类的实例。

但是当我阅读python教程时,它说:

  

键在字典中是唯一的,而值可能不是。字典的值可以是任何类型,但键必须是不可变的数据类型,如字符串,数字或元组。

感到困惑! #抱歉,我的表情很差!:(

示例代码为:

class RandomListNode:
    def __init__(self, x):
        self.label = x
        self.next = None
        self.random = None

dict = {}
node1 = RandomListNode(10)
node2 = RandomListNode(5)
dict[node1] = node2
print dict[node1].label #5

要点: Hashable(哈希值不会更改)或不可变对象可以是键值。 参考: https://docs.python.org/2/glossary.html#term-hashable

1 个答案:

答案 0 :(得分:4)

默认情况下,类的实例是唯一的,因此可以用作键。

实际约束是类中存在__hash__方法。如果您添加自定义__eq__方法,则还必须添加自己的__hash__方法,以便仍然可以考虑"不可变的" - 但请确保您的哈希值不随变异而变化,否则您的参赛作品将无法从setdict检索到。