字典

内存空间

  • 代码区:存储方法体的二进制代码。
  • 静态数据区:存储全局变量、静态变量、常量。
  • 动态数据区
    • 栈区:由系统自动分配和回收,存放函数的局部变量、参数值、返回值等。使用一级缓存,调用时处于存储空间,调用完立即释放。
    • 堆区:由程序员分配释放。类似于链表,使用二级缓存,生命周期由虚拟机的垃圾回收算法来决定。

字典

  • 底层实现

    • 散列表(哈希表):稀疏数组。数组的每个单元叫bucket,bucket包括键对象的引用和值对象的引用两部分。

    • 哈希函数:使键均匀分布在数组中,并且可以在内存中以O(1)的复杂度进行寻址,从而实现快速查找和修改。

    • 哈希碰撞(冲突):由于不同的键可能具有相同的哈希值,就可能出现冲突。

    • 建立哈希表

      • 添加数据:将key通过哈希函数装换成一个整型数字,将该数字对数组长度取余,取余结果就是数组下标,将值存储在以该数字为下标的数组空间中。
      • 查询数据:使用哈希函数将key转换成对应的数组下标,直接定位所在位置的值。
    • 哈希冲突解决

      • 开放寻址法:当产生哈希冲突时,通过一个探测函数计算出下一个侯选位置,如果仍存在冲突,通过探测函数继续查找,直至找到位置来存储元素。
      • 链地址法:将哈希值相同的key都存放在同一线性链表中,按顺序遍历就可以找到。
      • 再哈希法:按顺序规定多个哈希函数,每次查询的时候按顺序调用哈希函数。
    • 字典的键必须是可哈希的,虽然键查询速度快,但在内存中开销很大。

  • 内置函数和方法

    • len(dict):计算字典元素个数
    • str(dict):输出字典
    • dict.clear():删除字典内所有元素
    • dict.copy():返回一个字典的浅复制
    • dict.get(key,default=None):返回指定键的值,如果键不在返回默认值
    • key in dict:判断键是否在字典中
    • dict.items():以列表形式返回可遍历的(键,值)元组数组
    • dict.keys():返回一个迭代器,可以用list()来转换为列表
    • dict.values():返回一个迭代器,可以用list()来转换成列表
    • dict.update(dict1):将字典dict1的键值对更新到dict中
    • dict.setdefault(key,default=None):键不存在就会添加键并将值设为default
posted @ 2020-07-29 22:50  guguda  阅读(105)  评论(0)    收藏  举报