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爬虫之URLError异常处理
Feb 17 Python
python线程、进程和协程详解
Jul 19 Python
手把手教你python实现SVM算法
Dec 27 Python
django启动uwsgi报错的解决方法
Apr 08 Python
python sys.argv[]用法实例详解
May 25 Python
Python sorted函数详解(高级篇)
Sep 18 Python
pycharm: 恢复(reset) 误删文件的方法
Oct 22 Python
Python学习笔记之自定义函数用法详解
Jun 08 Python
python实现将文件夹内的每张图片批量分割成多张
Jul 22 Python
详解Python可视化神器Yellowbrick使用
Nov 11 Python
Python Celery多队列配置代码实例
Nov 22 Python
如何使用flask将模型部署为服务
May 13 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实现文件下载实例分享
2014/06/02 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
jquery滚动条插件jScrollPane的使用介绍
2013/11/08 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
jQuery中常用的遍历函数用法实例总结
2015/09/01 Javascript
使用jQuery制作基础的Web图片轮播效果
2016/04/22 Javascript
JS 调用微信扫一扫功能
2016/12/22 Javascript
Electron-vue脚手架改造vue项目的方法
2018/10/22 Javascript
JS实现li标签的删除
2019/04/12 Javascript
基于 vue-skeleton-webpack-plugin 的骨架屏实战
2019/08/05 Javascript
vue控制多行文字展开收起的实现示例
2019/10/11 Javascript
javaScript实现一个队列的方法
2020/07/14 Javascript
Vue数组响应式操作及高阶函数使用代码详解
2020/08/01 Javascript
[54:41]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VGJ.T VS paiN
2018/03/31 DOTA
python缩进区别分析
2014/02/15 Python
Python中Selenium模拟JQuery滑动解锁实例
2017/07/26 Python
python主线程捕获子线程的方法
2018/06/17 Python
BP神经网络原理及Python实现代码
2018/12/18 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
Python使用Pandas读写Excel实例解析
2019/11/19 Python
python3判断IP地址的方法
2021/03/04 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
大学生职业生涯规划书前言
2014/01/09 职场文书
高中生学期学习自我评价
2014/02/24 职场文书
培训科主任岗位职责
2014/08/08 职场文书
活动总结格式
2014/08/30 职场文书
房地产经营管理专业自荐信
2014/09/02 职场文书
会计试用期自我评价怎么写
2014/09/18 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
2015年试用期自我评价范文
2015/03/10 职场文书
2015教师年度工作总结范文
2015/04/07 职场文书
行政助理岗位职责范本
2015/04/11 职场文书
工作失职检讨书范文
2015/05/05 职场文书
本科毕业论文致谢怎么写
2015/05/14 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书
golang中的struct操作
2021/11/11 Golang