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

sum*_*mer 4 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
Run Code Online (Sandbox Code Playgroud)

总结:Hashable(哈希值不会改变)或immutable对象可以是key value。参考: https: //docs.python.org/2/glossary.html#term-hashable

Eth*_*man 6

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

__hash__实际的约束是类中存在方法。如果您添加自定义__eq__方法,您还必须添加自己的__hash__方法,以便仍然被视为“不可变”——但请确保您的哈希值不会随着突变而改变,否则您的条目将无法从sets 和dicts 检索。