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,如何解决?
    删除时候,不会真删除,而是会在这个位置加上标记,此处有人来过,那么就会再拿出这个位置的索引值,再进行一次哈希,找到位置,就能找出这个准确的值了,这就是解决哈希碰撞的方法。

字典扩容

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

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!