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 相关文章推荐
python使用reportlab实现图片转换成pdf的方法
May 22 Python
Python基于checksum计算文件是否相同的方法
Jul 09 Python
python散点图实例之随机漫步
Aug 27 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
Oct 31 Python
对pandas写入读取h5文件的方法详解
Dec 28 Python
Python写一个基于MD5的文件监听程序
Mar 11 Python
Python Pandas数据结构简单介绍
Jul 03 Python
pytorch 实现删除tensor中的指定行列
Jan 13 Python
python实现交并比IOU教程
Apr 16 Python
python字符串的index和find的区别详解
Jun 20 Python
keras的三种模型实现与区别说明
Jul 03 Python
python里glob模块知识点总结
Jan 05 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
解析php中的escape函数
2013/06/29 PHP
PHP中Array相关函数简介
2016/07/03 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
2016/11/12 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
轻松创建nodejs服务器(6):作出响应
2014/12/18 NodeJs
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
2015/10/01 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
jquery延迟对象解析
2016/10/26 Javascript
微信小程序 实现tabs选项卡效果实例代码
2016/10/31 Javascript
Bootstrap基本插件学习笔记之标签切换(17)
2016/12/08 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
详解如何构建Angular项目目录结构
2017/07/13 Javascript
Vue全家桶实践项目总结(推荐)
2017/11/04 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
QML实现圆环颜色选择器
2019/09/25 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
解决vue中的无限循环问题
2020/07/27 Javascript
python 字符串格式化代码
2013/03/17 Python
同时安装Python2 & Python3 cmd下版本自由选择的方法
2017/12/09 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
Python基础之循环语句用法示例【for、while循环】
2019/03/23 Python
python内存监控工具memory_profiler和guppy的用法详解
2019/07/29 Python
用Python抢火车票的简单小程序实现解析
2019/08/14 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
2019/08/20 Python
Tensorflow加载Vgg预训练模型操作
2020/05/26 Python
matplotlib事件处理基础(事件绑定、事件属性)
2021/02/03 Python
加拿大著名的奢侈品购物网站:SSENSE(支持中文)
2020/06/25 全球购物
毕业生在校学习的自我评价分享
2013/10/08 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
nginx反向代理时如何保持长连接
2021/03/31 Servers
mysql知识点整理
2021/04/05 MySQL
深入浅析Django MTV模式
2021/09/04 Python