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实现一个简单的项目监控
Mar 31 Python
在Python中使用base64模块处理字符编码的教程
Apr 28 Python
python实现在sqlite动态创建表的方法
May 08 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
Nov 06 Python
django rest framework 实现用户登录认证详解
Jul 29 Python
Python MySQLdb 执行sql语句时的参数传递方式
Mar 04 Python
关于matplotlib-legend 位置属性 loc 使用说明
May 16 Python
python 图像插值 最近邻、双线性、双三次实例
Jul 05 Python
大数据分析用java还是Python
Jul 06 Python
Python如何发送与接收大型数组
Aug 07 Python
Python第三方库安装缓慢的解决方法
Feb 06 Python
python反编译教程之2048小游戏实例
Mar 03 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读写文件的方法(生成HTML)
2006/11/27 PHP
PHP中的session永不过期的解决思路及实现方法分享
2011/04/20 PHP
php数组索引与键值操作技巧实例分析
2015/06/24 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
2017/04/18 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
JavaScript类和继承 prototype属性
2010/09/03 Javascript
window.location.hash 使用说明
2010/11/08 Javascript
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
javascript 星级评分效果(手写)
2012/12/24 Javascript
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
JavaScript 32位整型无符号操作示例
2013/12/08 Javascript
Bootstrap3.0学习教程之JS折叠插件
2016/05/27 Javascript
AngularJS实现Input格式化的方法
2016/11/07 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
使用bat打开多个cmd窗口执行gulp、node
2017/02/17 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
vue动画打包后失效问题的解决方法
2018/09/18 Javascript
jQuery实现的简单日历组件定义与用法示例
2018/12/24 jQuery
vue2路由方式--嵌套路由实现方法分析
2020/03/06 Javascript
[54:02]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 IG vs VGJ.T
2018/04/03 DOTA
Python实现将DOC文档转换为PDF的方法
2015/07/25 Python
Python 经典面试题 21 道【不可错过】
2018/09/21 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
python实现机器人卡牌
2019/10/06 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
python中如何使用insert函数
2020/01/09 Python
接口自动化多层嵌套json数据处理代码实例
2020/11/20 Python
html5 video标签屏蔽右键视频另存为的js代码
2013/11/12 HTML / CSS
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
大学生职业规划论文
2014/01/11 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
2014年大学教师工作总结
2014/12/02 职场文书
行为规范主题班会
2015/08/13 职场文书