有这段代码
ti = {
'ke': 213,
31: 'zna',
(1, 2, 3): 'kort',
}
# {'ke': 213, 31: 'zna', (1, 2, 3): 'kort'}
他没事。钥匙适合一切,但当我尝试做时:
ti = {
'ke': 213,
31: 'zna',
(1, [1, 2], 3): 'kort',
}
我得到一个错误:
TypeError: unhashable type: 'list'
我知道键必须是可哈希的不可变类型。我可以使用元组,前提是其中的所有内容都是不可变的。并且列表无法散列。但事实上,我们无法更改元组。
为什么它的内部很重要?我无法更改其内容。
PS 奇怪之处在于列表有一个方法__hash__
print(dir(list('dewf')))
# ...'__gt__', '__hash__', '__iadd__',...
引用文档:
如果键是一个可变对象,它的值可能会改变,因此它的散列也可能会改变。
但这就是问题的症结所在。我无法更改元组
a = [1, 2]
kort = (1, a, 4)
print(kort) #(1, [1, 2], 4)
a = [5, 6]
print(kort) #(1, [1, 2], 4)
有一个简单的原则可能无法解释这种行为,但给出了可以用作字典中的键的想法。
有些数据类型是不可变的(str、int 等),也就是说,您不能通过存储在变量/键中的引用来更改数据。这很可能是密钥的正确用法。
官方文档中的 FAQ在这里包含了这个问题的答案。
简而言之:当可变数据类型发生变化时,其散列也可能发生变化。因此,如果您使用可变数据类型作为键并尝试在字典中查找相同的对象,则不会找到它,因为它的哈希值不同。该文档还指出,如果您尝试通过旧值查找,也不会找到它。
我不太了解问题的实际应用,除非您了解该语言的内在厨房。
评论有问题。您可以在元组中交换列表
PS:有时间可以翻译一下offdoc的答案