python中的列表和元组区别分析


Posted in Python onDecember 30, 2020

列表(list)和元组(tuple)的一些基础

list和tuple都是一个可以放置任意数据类型的有序集合,都是既可以存放数字、字符串、对象等

python中的列表和元组区别分析

list和tuple都支持负索引

In [8]: nums[-2]
Out[8]: 'ad'
In [9]: tp[-2]
Out[9]: '33'

list和tuple都支持切片操作

In [10]: nums[1:3]
Out[10]: [3, 'ad']
In [11]: tp[1:3]
Out[11]: (3, '33')

list和tuple都可以随意嵌套

In [12]: nums = [[1,2,3],['s','ff'],['34',3,5]]
In [13]: tp = ((23,4,'f'),45,'d',('dd',4,'ff'))

list和tuple的一些区别

  • 列表是动态的,长度大小不固定,可以随意的增加、删除、修改元素
  • 元组是静态的,长度在初始化的时候就已经确定不能更改,更无法增加、删除、修改元素

python中的列表和元组区别分析

从图中看出我们对list做出修改是成功的,但是对tuple修改的时候,确抛出了错误,那如果想对tuple做出改变该如何做呢?只能重新开辟一块内存,重新生成新到的tuple了。

python中的列表和元组区别分析

从tuple的源码中也可以看出,只有两个自带的方法,一个是统计元素出现的次数一个是查询元素的索引。

list和tuple存储方式的差异

我们先来看个例子

In [19]: nums=['a',1,2]
In [20]: tp=('a',1,2)
In [21]: nums.__sizeof__()
Out[21]: 64
In [22]: tp.__sizeof__()
Out[22]: 48

这里构造了一个list和一个tuple。他们存储的内容是相同的,__sizeof__方法可以打印系统分配空间的大小。可以看到他们所占用的内存空间是不同的,存储的内容相同,但是list比tuple多占用了16自己的内存。

先来看一下一个数组的内存分配过程:

In [23]: l=[]

In [24]: l.__sizeof__() // 空列表分配了40字节的内存
Out[24]: 40

In [25]: l.append('a') // 增加了一个一个元素后,给列表分配了72字节的内存,一个字符8个字节
												// 那就是一次性分配了4个字符的内存空间

In [26]: l.__sizeof__()
Out[26]: 72

In [27]: l.append('b') // 再增加字符,占用内存不变

In [28]: l.__sizeof__()
Out[28]: 72

In [29]: l.append('c') // 再增加字符,占用内存不变

In [30]: l.__sizeof__()
Out[30]: 72

In [31]: l.append('d') // 再增加字符,占用内存不变

In [32]: l.__sizeof__()
Out[32]: 72

In [33]: l.append('e') // 再添加元素,内存不够,触发重新的内存分配

In [34]: l.__sizeof__()
Out[34]: 104

可以看出list为了能够实时追踪内存的使用情况,当空间不足时以及分配额外空间,额外的多分配了内存,而且还需要存储指针,指向对应的元素。

我们可以看到,为了减小每次增加 / 删减操作时空间分配的开销,Python 每次分配空间时都会额外多分配一些,这样的机制(over-allocating)保证了其操作的高效性:增加 / 删除的时间复杂度均为 O(1)。但是对于元组,情况就不同了。元组长度大小固定,元素不可变,所以存储空间固定。

所以说在存储大量的数据的时候,这种差异是需要考虑的,如果数据发生变更的可能性不大,就用元组存储,如果数据是需要频繁的进行数据的修改增加,就使用列表

Python 相关文章推荐
批量将ppt转换为pdf的Python代码 只要27行!
Feb 26 Python
python+selenium 点击单选框-radio的实现方法
Sep 03 Python
浅谈python中频繁的print到底能浪费多长时间
Feb 21 Python
Python -m参数原理及使用方法解析
Aug 21 Python
详解python程序中的多任务
Sep 16 Python
python 窃取摄像头照片的实现示例
Jan 08 Python
Python中的面向接口编程示例详解
Jan 17 Python
Python try except finally资源回收的实现
Jan 25 Python
彻底解决pip下载pytorch慢的问题方法
Mar 01 Python
python中subplot大小的设置步骤
Jun 28 Python
如何利用Python实现一个论文降重工具
Jul 09 Python
python playwright之元素定位示例详解
Jul 23 Python
python实现xml转json文件的示例代码
Dec 30 #Python
python实现KNN近邻算法
Dec 30 #Python
python 实现逻辑回归
Dec 30 #Python
Python 随机按键模拟2小时
Dec 30 #Python
Python的scikit-image模块实例讲解
Dec 30 #Python
用Python实现职工信息管理系统
Dec 30 #Python
python实现双人五子棋(终端版)
Dec 30 #Python
You might like
法兰绒滤网冲泡
2021/03/03 冲泡冲煮
Joomla调用系统自带编辑器的实现方法
2016/05/05 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
2013/12/13 Javascript
HTML+CSS+JS实现完美兼容各大浏览器的TABLE固定列
2015/04/26 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
AngularJS入门教程之AngularJS表达式
2016/04/18 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
vue的Virtual Dom实现snabbdom解密
2017/05/03 Javascript
Bootstrap多级菜单的实现代码
2017/05/23 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
Vue项目使用CDN优化首屏加载问题
2018/04/01 Javascript
Rollup处理并打包JS文件项目实例代码
2018/05/31 Javascript
JS工厂模式开发实践案例分析
2019/10/17 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
2020/08/14 Javascript
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
[01:04:31]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第二场 1月8日
2021/03/11 DOTA
python文件读写操作与linux shell变量命令交互执行的方法
2015/01/14 Python
python常用函数详解
2016/09/13 Python
Python代码一键转Jar包及Java调用Python新姿势
2020/03/10 Python
Python线程协作threading.Condition实现过程解析
2020/03/12 Python
Python趣味入门教程之循环语句while
2020/08/26 Python
iKRIX意大利网上商店:男女豪华服装和配件
2019/10/09 全球购物
英文版网络工程师求职信
2013/10/28 职场文书
工业设计专业推荐信
2013/10/29 职场文书
微型企业创业投资计划书
2014/01/10 职场文书
初中三好学生事迹材料
2014/01/13 职场文书
大学毕业感言50字
2014/02/07 职场文书
《蜗牛的奖杯》教后反思
2014/04/24 职场文书
2014领导班子四风问题对照检查材料思想汇报
2014/09/21 职场文书
新郎结婚保证书
2015/02/26 职场文书
优秀学生干部主要事迹材料
2015/11/04 职场文书
使用Redis做预定库存缓存功能
2022/04/02 Redis