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) 示意图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2022-03-02 02--Redis基础:python操作redis