Python:字典中的键类型应为不可变,但为什么我可以用节点类的实例作为键?
无论是在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__
方法,这样才能被认为是“不可变的”——但要确保你的哈希值在对象变化时不会改变,否则你就无法从 set
和 dict
中找到你的条目。