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 XML RPC服务器端和客户端实例
Nov 22 Python
python获取从命令行输入数字的方法
Apr 29 Python
Python实现PS滤镜的旋转模糊功能示例
Jan 20 Python
python监控键盘输入实例代码
Feb 09 Python
python实现俄罗斯方块游戏
Mar 25 Python
python 实现在无序数组中找到中位数方法
Mar 03 Python
Keras框架中的epoch、bacth、batch size、iteration使用介绍
Jun 10 Python
keras做CNN的训练误差loss的下降操作
Jun 22 Python
深入了解Python enumerate和zip
Jul 16 Python
PyCharm+PyQt5+QtDesigner配置详解
Aug 12 Python
在python中对于bool布尔值的取反操作
Dec 11 Python
Python用户自定义异常的实现
Dec 25 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
ThinkPHP使用smarty模板引擎的方法
2014/07/01 PHP
PHP合并静态文件详解
2014/11/14 PHP
PHP实现全角字符转为半角方法汇总
2015/07/09 PHP
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
PHP二维数组去重算法
2016/12/17 PHP
javascript object array方法使用详解
2012/12/03 Javascript
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
jQuery操作CheckBox的方法介绍(选中,取消,取值)
2014/02/04 Javascript
父页面显示遮罩层弹出半透明状态的dialog
2014/03/04 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
jqeury-easyui-layout问题解决方法
2014/03/24 Javascript
wap浏览自动跳转到wap页面的js代码
2014/05/17 Javascript
JavaScript中的getMilliseconds()方法使用详解
2015/06/10 Javascript
ES6 Promise对象概念与用法分析
2017/04/01 Javascript
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
2017/07/18 Javascript
如何开发出更好的JavaScript模块
2017/12/22 Javascript
vue+elementUI实现图片上传功能
2019/08/20 Javascript
QML实现圆环颜色选择器
2019/09/25 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
python装饰器初探(推荐)
2016/07/21 Python
Django实战之用户认证(初始配置)
2018/07/16 Python
Python动态生成多维数组的方法示例
2018/08/09 Python
解决pycharm运行时interpreter为空的问题
2018/10/29 Python
python之Flask实现简单登录功能的示例代码
2018/12/24 Python
Python编程快速上手——疯狂填词程序实现方法分析
2020/02/29 Python
Python正则表达式学习小例子
2020/03/03 Python
python中pow函数用法及功能说明
2020/12/04 Python
Python中对象的比较操作==和is区别详析
2021/02/12 Python
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
教师网络培训感言
2014/03/09 职场文书
党员批评与自我批评发言
2014/10/02 职场文书
2014年小班保育员工作总结
2014/12/23 职场文书
离婚答辩状范文
2015/05/22 职场文书
今日说法观后感
2015/06/08 职场文书
vue如何清除浏览器历史栈
2022/05/25 Vue.js