写点什么

Python 核心技术与进阶 list & tuple

用户头像
Bonaparte
关注
发布于: 2020 年 05 月 17 日

数据结构是每门变成语言的根据,tuple 和 list 是 Python 中最基础的数据结构。



list 和 tuple 都是一个可放置任意数据类型的有序集合。Python 中的 list 和 tuple 并不要求 set 中的数据类型一致。



list 和 tuple 的区别



list 是动态的,长度大小不固定,可随意的增、删、改变元素(mutable);

tuple 是静态的,长度大小固定,无法进行删减或改变元素(immutable)。



和其他编程语言一样,Python 中索引的起始位置是0,从0开始数,第 4 个 item 代表的是第 5 个 元素。

当我们去修改 tuple 的 元素的时候,会报错 TypeError ,因为 tuple 的元素是不可变的。



如要修改 tuple 的话,那么就必须要新建一个新的 tuple ,开辟新的内存。



list 是动态的,只需简单的在 list 末尾加入相应的元素即可。



Python 中的 list 和 tuple 都是支持负数索引的。-1代表最后一个元素,-2代表倒数第二个元素...

Python 中的 list 和 tuple 都支持切片操作;

Python 中的 list 和 tuple 都可以随意嵌套;



Python 中的 list 和tuple 可通过 list() 和 tuple() 相互转换



count("item") 表示统计 list 或 tuple 中 item 出现的次数;

index("item") 表示返回 list 或 tuple 中 item 第一次的索引;



list.reverse() 表示 list 的原地倒装 list;

list.sort()表示 list 的排序;



list(reversed(list_variable)) 也能原地倒装 list;

sorted(list_variable) 也能给 list 排序;



list(reversed(tuple_variable) 还能原地倒装 tuple;

sorted(tuple_variable) 还能给 tuple 排序;



list 是动态的,可变的;tuple 是静态的,不可变的。



list 是动态的,需要存储指针,指向对应元素;因为可变,所以要需额外存储已分配长度大小,用来实时追踪 list 空间使用情况,当空间不足时,能及时分配额外空间。



为每次增加/删减操作时空间分配,Python每次分配空间时都会额外分配一些的过渡分配机制(Over Allocating)保证了其操作的高效性。增加/删减的时间复杂度为O(1)[复杂度为常数阶]



tuple 长度大小固定,item 固定,存储空间固定。



通过tuple 和 list 的存储方式差异,tuple 要比 list 更加轻量级一些,从总体上来看,tuple 性能速度要略优于 list。



Python 会在后台,对静态数据做一些资源缓存(resource caching)。垃圾回收机制存在,如果一些 variable 不被使用,Python 就会回收他们所占用的内存,返还给操作系统,以便其他 variable 或应用所使用。



tuple 就是一些 静态变量,如果 tuple 不被使用或占用空间不大时,Python 会暂时缓存这部分内存。下次我们会创建同样大小的 tuple 时,Python 就可以不用再向操作系统发出请求,去寻找内存,而是可以直接分配之前缓存的内存空间,这样就能大大加快程序运行速度。





奇怪哈,课程里面,tuple 的初始化速度,要比 list 快 5 倍以上,但在索引操作上,两者的索引差别非常小,几乎可忽略不计



在增加、删减、改变元素,list 操作上性能更优。



在存储数据和数量不变的使用场景下,选择 tuple 肯定更加合适。例如,某个function 函数的功能是返回一个地点的经纬度,然后直接传给前端渲染。



在存储数据和数量可变的使用场景下,选择 list 则更加合适了。例如,社交平台上的某个日志功能,统计一个用户在一周内,看了哪些用户的帖子。



用户头像

Bonaparte

关注

还未添加个人签名 2017.11.23 加入

还未添加个人简介

评论

发布
暂无评论
Python 核心技术与进阶 list & tuple