Python 中的 list、tuple、set、dict的底层实现的理解:
List 本质是顺序表,只不过每次表的扩容都是指数级,所以动态增删数据时,表并不会频繁改变物理结构,同时受益于顺序表遍历的高效性(通过角标配合表头物理地址,计算目标元素的位置),使得python的list综合性能比较优秀;
tuple 本质上就是顺序表,不可修改不可扩容,只读;
dict:本质上是顺序表,不过每个元素存储位置的角标,不是又插入顺序决定的,而是由key经过hash算法和其他机制,动态生成的,即key通过hash散列,生成value应该存储的位置,然后再去存储这个value;所以dict的查询时间复杂度是o(1);因此,dict的key只能为可hash的对象,即不可变类型;
set 实现列表去重:
本质上是通过__hash__和__eq__来实现对每个元素的hash散列,判断hash值是否一致;一致的话,判断对象是否具有一模一样的方法和属性,如果都一致,则去重;因此,set元素也必须是可hash的;
深入一点去理解set:set本质也是dict,只不过其键值都一样;实现去重其实就是这么个过程:首先对key进行hash,在dict中这一步是为了获取value的索引,这里也一样;如果索引相同,说明要么数据重复了,要么key发生了hash碰撞,这时候就去比较两个key对应的value是否相同,如果也相同,确认是数据重复,则去重(保留最新的那个);如果数据不同,说明只是在当前hash算法中,两个key刚好发生了hash碰撞(概率相当低),此时不会发生去重;
个人结合其他博主的文章总结的,加入了一些个人理解,不当之处还望指正。
参考文章:
https://blog.youkuaiyun.com/liuweiyuxiang/article/details/98943272
https://blog.youkuaiyun.com/answer3lin/article/details/84523332