python中可哈希的数据类型,即不可变的数据结构(数值类型(int,float,bool)字符串str、元组tuple、自定义类的对象)。
不可哈希的数据类型,即可变的数据结构 (字典dict,列表list,集合set)。
集合中的元素必须是可hash的,即不可变的数据类型。空集合 a=set() ,注意a={}创建的是一个空字典。
我就老纠结一个问题:为啥集合的元素都是可哈希,但集合却不可哈希?
我最终找到了答案:
可哈希的数据结构,一旦建立,是不允许修改的,比如添加、删除等,而集合却允许,比如:
我的理解是,对于可哈希的对象key,我们能用一个函数hash(key),计算得到一个值value,由value去访问该对象,这个key与value一一对应,这样的做法可以加快访问时间,但由于新建了value,所以占用了空间。
这个hash函数就是完成的从key到value的一种对应关系。
hash表就是就是存放value的数组。
存储位置=hash(键)
value = hash(key)
可哈希意思就是,通过hash函数,能产生唯一的value与key对应,如果key改变,value也应该改变,但是可变的数据结构,比如列表,它改变后,列表地址是不变的,可以理解为:不同的key指向了相同的value,这就发生了冲突,所以说列表是不可哈希的。
哈希的原则是通过一一对应的key和value,实现对key的快速访问,自然是不希望出现冲突的情况,在哈希表中,这种情况叫做碰撞,碰撞是难免的,我们只能想办法减少碰撞的发生。
至于为什么能加快访问速度?可以这样想,我们要从电话号码本里找到某人,普通方法是一个个往上滑,简便方法是通过首字母快速导航。
python的字典就是哈希表的应用之一。
注意,我们定义字典的key与value与上面说的hash表的不一样。
字典的底层实现就是哈希表的原理。
在字典中,我们希望"key"是可哈希的,也就是不可变的,实现对value的一对一访问,具体地:字典中[key:value],对key进行hash运算,得到哈希值,根据哈希值来访问value。
标签:hash,哈希,不可,value,key,字典 From: https://www.cnblogs.com/clark1990/p/16808406.html