Python--字典底层存储、补充-类型对象、函数传参、列表底层存储

dict字典-底层存储

# python 字典底层存储
https://www.cnblogs.com/xiaoyuanqujing/articles/12008689.html
    

    
# Python中 数据类型都是对象
  都是地址引用,不存在值类型,都是引用类型
  所以才有可变和不可变数据类型  # 是为了和其他语言相对应   可变<--->引用  不可变<--->值

  # 其他语言中有值类型和引用类型,不存在可变和不可变这么一说


    
# 为什么python中字典的key,必须是不可变数据类型
  因为字典key值必须可hash
  所以作者就把不可变数据类型都做成了可hash  # 使用hash函数计算,不同对象得到不同值

# 若自定义的对象,要做成字典的key
  重写对象的__hash__方法,做成可hash,就可以做字典的key   # 但一般不做



# python中的函数传参 
  若是可变类型,  就是传了地址(引用),会影响原来的
  若是不可变类型,新创建了一份传入了,不会影响原来的

list列表-底层原理

https://blog.csdn.net/liuweiyuxiang/article/details/106534166

# 列表底层:依附于数组    与 Go 的切片原理很像
  
  1.创建列表,会预先分配的内存总容量(allocated),实际长度(size) 的数组

  2.每个元素值,指向具体值的指针(地址),再指向具体的值
    
    # python的list并不直接保存元素,而是保存元素的指针
    # 这也是同一个list中可以同时存放多种类型元素的根本原因
    
    
  3.列表操作的实际原理
    -append  追加  # 时间复杂度是O(1)
      若在数组的内存总容量(allocated) :
        直接在数组末尾,追加一个新的索引,指向元素指针,再指向元素值
        
      若超过数组的内存总容量(allocated) :
        会先翻倍 扩充内存总容量(allocated)
        再直接在数组末尾,追加一个新的索引,指向元素指针,再指向元素值 
        
    
    -pop 弹出末尾   # 时间复杂度是O(1)
      直接在数组末尾,弹出元素,依旧指向元素指针,再指向元素值
      若是实际长度(size),少于allocated的一半,allocated就会申请缩小到一半
  		
    -remove  删除   # 时间复杂度是O(n)

    -insert  插入   # 时间复杂度是O(n)
     删除和插入,都是在数组的指定位置 操作,然后索引后面的元素依次 向前 或 向后移动
        
        
        
# 拓展:
  JAVA中的 
    # ArrayList : 数组    
        连续存储,底层基于数组
        
        时间复杂度:
           取值、赋值 ---> O(1) 
           插入、删除 ---> O(n)
    
    # LinkedList: 链表   
        链接存储,底层基于链表
          链表不是连续的,而是每个元素位置会存有 指向下个元素的地址 
		
        时间复杂度:
           取值、赋值 ---> O(n) 
           插入、删除 ---> O(1)  
          # 只需要将某个元素 原本指向下一个元素的地址,修改成新元素的地址
            新元素的地址,指向下一个元素的地址
    
    
    
# L.insert(1, 5) 示意图

posted @   Edmond辉仔  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2022-03-02 02--Redis基础:python操作redis
点击右上角即可分享
微信分享提示