理解字典

Towards understanding dictionaries

我需要使用多个哈希表,所以在 , I would normally use an std::unordered_map 中。到目前为止,我可以理解我可以在 Python 中使用字典,所以让我们假设以下代码:

my_dict_1 = {}
my_dict_1['foo'] = 1
my_dict_2 = {}
my_dict_2['foo'] = 2

这两个字典会不会使用不同的哈希函数(注意键是相同的),因此它们可以被认为是两个不同的哈希表(我的意思是它们实际上会以不同方式存储数据)?


编辑:

是的,字典当然是两个不同的对象,但问题在于它们将用于存储数据的技术!

一个简单的 Python shell 实验来证明不同的词典可以使用相同的键:

>>> my_dict_1 = {'foo':1}
>>> my_dict_2 = {'foo':2}
>>> my_dict_1,my_dict_2
({'foo': 1}, {'foo': 2})

This 很好地讨论了它是如何实现的。关键是每个字典都分配了自己的内存部分(当然可以根据需要增长)。 完全相同的哈希函数用于两个字典,但用于探测内存中的不同区域。

id(...)

id(对象) -> 整数

Return 对象的标识。这保证在同时存在的对象中是唯一的。 (提示:是对象的内存地址。

上面是id doc字符串,它说对象的标识是对象的内存地址,所以我们可以使用id函数来查看变量的内存地址:

在你的程序中,我可以看到这样的地址:

def main():
    my_dict_1 = {}
    my_dict_1['foo'] = 1
    my_dict_2 = {}
    my_dict_2['foo'] = 2
    print(hex(id(my_dict_1['foo'])))
    print(hex(id(my_dict_2['foo'])))

if __name__ == '__main__':
    main()

这个程序输出这个:

0x9a33e0
0x9a3400

我们可以看到my_dict_1['foo']my_dict_2['foo']有不同的内存地址

所以我认为这两个dict应该使用相同的哈希函数,但是变量的内存地址应该是哈希值和一个基值之和。这样,两个变量就会存储在不同的内存区。