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 相关文章推荐
Python3 socket同步通信简单示例
Jun 07 Python
python设置值及NaN值处理方法
Jul 03 Python
Pandas GroupBy对象 索引与迭代方法
Nov 16 Python
python学生管理系统学习笔记
Mar 19 Python
django框架model orM使用字典作为参数,保存数据的方法分析
Jun 24 Python
python3实现二叉树的遍历与递归算法解析(小结)
Jul 03 Python
python字符串的拼接方法总结
Nov 18 Python
Python Tkinter模块 GUI 可视化实例
Nov 20 Python
Python3 全自动更新已安装的模块实现
Jan 06 Python
python 实现线程之间的通信示例
Feb 14 Python
如何把python项目部署到linux服务器
Aug 26 Python
python中round函数保留两位小数的方法
Dec 04 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
PHP5在Apache下的两种模式的安装
2006/09/05 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
2017/03/14 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
JS仿flash上传头像效果实现代码
2011/07/18 Javascript
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
2013/01/04 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
更快的异步执行(setTimeout多浏览器)
2014/08/12 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
2015/01/13 Javascript
JavaScript插件化开发教程 (四)
2015/01/27 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
解决vue打包之后静态资源图片失效的问题
2018/02/21 Javascript
vue filters的使用详解
2018/06/11 Javascript
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
vue-cli的工程模板与构建工具详解
2018/09/27 Javascript
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
JavaScrip如果基于url实现图片下载
2020/07/03 Javascript
python写的一个文本编辑器
2014/01/23 Python
Python素数检测实例分析
2015/06/15 Python
Python中shutil模块的学习笔记教程
2017/04/04 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
2017/09/24 Python
matplotlib subplots 调整子图间矩的实例
2018/05/25 Python
Python将list中的string批量转化成int/float的方法
2018/06/26 Python
使用wxpy实现自动发送微信消息功能
2020/02/28 Python
Python3将ipa包中的文件按大小排序
2020/04/17 Python
Django中的AutoField字段使用
2020/05/18 Python
大学活动邀请函
2014/01/28 职场文书
遗嘱公证书标准样本
2014/04/08 职场文书
园艺师求职信
2014/04/27 职场文书
促销活动总结模板
2014/07/01 职场文书
上班迟到检讨书
2014/09/15 职场文书
委托培训协议书
2014/11/17 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
2015国庆节66周年标语
2015/07/30 职场文书
MongoDB 常用的crud操作语句
2021/06/20 MongoDB