Python 字典实现原理

Python 字典实现原理

伪代码

a = {}
a['key1'] = 1
a['key2'] = 6
del a ['key1']

底层实现

  1. Python解释器 执行 a ={}
    Python解释器读到这里,比如会给5个连续的内存空间,有5个连续的内存地址,可以放数据
  2. Python解释器 执行 a[‘key1’] = 1
    这里,Python解释器会对key1进行哈希运算,得到一个十位进制的哈希值,因为是5个位置,所以会对5取,就会得到0,1,2,3,4 五个位置,比如key1取余得到 1 ,就会把值放进1位置上,这就叫哈希位置映射也叫hashmap,但是会有一种情况,就是两个key有可能算出一样的哈希值
  3. Python解释器 执行a[‘key123’] = 6
    也有可能算出位置1,但是位置1被占据了 ,这时候解析器会把key123哈希出来的值,再加上key1的位置1,再进行哈希,再取余,就能得到一个新地址,放进去。
    删除值呢?
    比如删除
  4. Python解释器 执行 del a = [‘key1’]
    那么在查找a[‘key123’]时候,因为哈希出来的位置一样,但是位置里的内容为空,那么会找不出值,发送keyerror,如何解决?
    删除时候,不会真删除,而是会在这个位置加上标记,此处有人来过,那么就会再拿出这个位置的索引值,再进行一次哈希,找到位置,就能找出这个准确的值了,这就是解决哈希碰撞的方法。

字典扩容

字典的扩容,是一旦少于总容量的三分之一,就会进行扩容,位置重新排,因为总长度变了,如果数据量一旦大起来,就浪费很大的三分之一,这也是这套算法的缺点之一,用空间换取时间。所以字典不能做大数据存储。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值