Python dict的查找功能是如何工作的?

Python dict的查找功能是如何工作的?,python,dictionary,hash,Python,Dictionary,Hash,众所周知,可变类型不能是字典的键 然而,如果你使用C++,那么正则映射允许使用向量和数组作为映射键,因为规则映射是作为树实现的。 但是,C++还允许使用数组作为无序映射的键,它在精神上与Python字典更接近,因为它可以为键散列键,只要您为不知道如何散列的类型提供哈希函数。 所以我想知道,只要提供一个_散列_)方法,Python是否也会允许您这样做 如果您决定使用一个具有类似于cpp的半健壮散列函数的可变键,是否可能?DICT是如何存储在内存中的?简化版 对于dict中的每个键,计算散列,然后将

众所周知,可变类型不能是字典的键

然而,如果你使用C++,那么正则映射允许使用向量和数组作为映射键,因为规则映射是作为树实现的。

但是,C++还允许使用数组作为无序映射的键,它在精神上与Python字典更接近,因为它可以为键散列键,只要您为不知道如何散列的类型提供哈希函数。 所以我想知道,只要提供一个_散列_)方法,Python是否也会允许您这样做

如果您决定使用一个具有类似于cpp的半健壮散列函数的可变键,是否可能?

DICT是如何存储在内存中的?简化版

对于dict中的每个键,计算散列,然后将键和值存储在散列定义的位置 如果多个键具有相同的散列或散列指向相同的存储目标,则该位置将有一个键值对列表 如何从内存中读取dict值?简化版

将计算密钥的哈希值,并根据该哈希值计算内存中的位置 从该位置逐个读取键值对,并使用==运算符将其与搜索的键进行比较 结论

要在dict中找到键call it key1,dict应该包含一个键call it key2,其中hashkey1==hashkey2和key1==key2

那么为什么可变键是个坏主意呢


因为hashkey是在将key写入dict时计算出来的,并且它在该时间点上与key的值相匹配,但是如果key是可变的,并且您在dict中对其进行了变异,dict将不会重新计算hashkey,因此将无法再找到该key。

C++具有常量。C++地图的关键是const。@ USER(Enr315112),这是有意义的!IgnacioVazquez Abrams不是被定义为list子类的一部分吗?是的,是为您的hlist类定义的。但是c不等于a,所以这就是为什么你会得到一个键错误。记住,dict中存储的hlist是a,因此您使用的每个键都会检查是否与a相等。是否回答了您的问题?我不太清楚你说的是什么意思,可能吗?。很明显,你可以用不稳定的散列设置可变键,这不是个好主意,不是吗?
In [1]: b = {}

In [2]: class hlist(list):
   ...:     def __hash__(self):
   ...:         temp = []
   ...:         for item in self:
   ...:             print item
   ...:             temp.append(item)
   ...:         return hash(tuple(temp))
   ...:

In [3]: a = hlist([1,2,3,4])

In [4]: c = hlist([1,2,3,4])

In [5]: b[a] = "car"
1
2
3
4

In [6]: b[c]
1
2
3
4
Out[6]: 'car'

In [7]: a.append(5)

In [8]: b[c]
1
2
3
4
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-8-013e994efe63> in <module>()
----> 1 b[c]

KeyError: [1, 2, 3, 4]
In [11]: b[hlist([1,2,3,4,5])]
1
2
3
4
5
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-11-09593553a69b> in <module>()
----> 1 b[hlist([1,2,3,4,5])]

KeyError: [1, 2, 3, 4, 5]