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

4 投票
1 回答
1178 浏览
提问于 2025-04-18 16:28

无论是在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

总结: 可以作为键的值必须是可哈希的(哈希值不会改变)或不可变的对象。 参考: https://docs.python.org/2/glossary.html#term-hashable

1 个回答

6

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

真正的限制在于类中是否有一个 __hash__ 方法。如果你添加了一个自定义的 __eq__ 方法,你还必须添加自己的 __hash__ 方法,这样才能被认为是“不可变的”——但要确保你的哈希值在对象变化时不会改变,否则你就无法从 setdict 中找到你的条目。

撰写回答