• Python学习4(字典的内存分布)


    1、字典:是python数据类型之一,字典通过花括号来包含数据项,字典的每个元素由2个部分组成,键:值,字典是根据键来找对应的值。

    data = {"name": "Ethon", "age": 12, "address": "Shen zhen"}

    2、字典的特点

    • 字典与列表、集合一样,都是属于可变数据类型

    • 字典和列表一样,也能够存储多个数据

    • 键对象具有唯一性,因此只有不可变数据类型(数字,字符串和元组)才能作为键键对象

    • 值对象可以为python的任意数据类型

    3、字典的内存分布

    data = {"name": "Ethon", "age": 12, "address": "Shen zhen"}
    print(data) # {'name': 'Ethon', 'age': 12, 'address': 'Shen zhen'}

     4、字典底层原理

    字典对象的核心是散列表,散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做 bucket。每个 bucket 有两部分:一个是键对象的引用,一个是值对象的引用。由于所有 bucket 结构和大小一致,我们可以通过偏移量来读取指定 bucket。

    4.1、键值的存储过程

    data = {}
    data["name"] = "Ethon"
    data["age"] = 12
    data["address"] = "Shen zhen"
    print(bin(hash("name")))
    # -0b110101010110011100010010100000011000110000001101000100000111101
    print(bin(hash("age")))
    # 0b1001111110011010111111111010000010110010101000011000011100
    print(bin(hash("address")))
    # 0b100011011010010101010010100001110110010101001101100010000110011

    1.首先要计算data["name"]的散列值

    2.得到hash值后,我们从hash值最右边3位数字作为偏离量,即"101"

    3.我们查看偏移量"101" 对应的bucket是否为空,如果为空,则将键值对放进去

    4.如果不为空,则依次去右边3位作为偏离量,即111"

    5.再看偏离量"111" 对应的bucket是否为空,直到找到为空的bucket将键值对放进去。

     

    4.2、字典查找值的过程

    1.我们要计算data["name"] 里面的"name"对象

    2.确定偏离量,散列值的最右边3位数字作为偏离量 "101"

    3.查看偏离量"101"对应的bucket是否为空,如果为空,则返回None

    4.如果不为空,则将这个bucket的键对象计算出对应的散列值和data["name"]的"name"散列值进行比较,如果两个散列值相等,则将对应数组里的值对象返回,如果不相等,则再依次取其他几位数字,重新计算偏离量。依次取完,仍然没有找到,则返回None。

  • 相关阅读:
    技术栈
    GO环境配置
    玩转 Helm
    innoSetup打包文件编写模板
    Linux环境安装Nginx笔记
    github ations 入门使用
    python52异步处理demo记录 广深
    人生苦短我学Java15递归、文件IO/字节/字符/转换/打印流 广深
    CSS超出字数展示点点点
    关于python3.9安装Airtest跑脚本“jinja2”报错的问题说明
  • 原文地址:https://www.cnblogs.com/wakey/p/16246920.html
Copyright © 2020-2023  润新知