走向理解词典

时间:2016-05-08 13:31:54

标签: python dictionary hash hashtable hash-function

我需要使用多个哈希表,因此在中,我通常会使用std::unordered_map。到目前为止,我可以理解我可以在Python中使用字典,所以让我们假设以下代码:

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

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

编辑:

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

2 个答案:

答案 0 :(得分:2)

一个简单的Python shell实验,显示不同的词典可以使用相同的键:

X

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

答案 1 :(得分:1)

ID(...)

id(object) - >整数

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

上面是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']有不同的内存地址。

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