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连接phoenix的方法示例
Sep 29 Python
python如何派生内置不可变类型并修改实例化行为
Mar 21 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
Apr 18 Python
查找python项目依赖并生成requirements.txt的方法
Jul 10 Python
python合并已经存在的sheet数据到新sheet的方法
Dec 11 Python
python 判断矩阵中每行非零个数的方法
Jan 26 Python
python的mysql数据库建立表与插入数据操作示例
Sep 30 Python
python实现随机加减法生成器
Feb 24 Python
在pytorch中实现只让指定变量向后传播梯度
Feb 29 Python
Python基于BeautifulSoup爬取京东商品信息
Jun 01 Python
python批量更改目录名/文件名的方法
Apr 18 Python
python tkinter Entry控件的焦点移动操作
May 22 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
第1次亲密接触PHP5(1)
2006/10/09 PHP
PHP中的Session对象如何使用
2015/09/25 PHP
yii2使用gridView实现下拉列表筛选数据
2017/04/10 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
基于PHP实现用户在线状态检测
2020/11/10 PHP
Domino中运用jQuery读取视图内容的方法
2009/10/21 Javascript
jQuery 常见开发使用技巧总结
2009/12/26 Javascript
Jquery 动态添加按钮实现代码
2010/05/06 Javascript
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
2011/07/10 Javascript
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
javascript中的取反再取反~~没有意义
2014/04/06 Javascript
影响jQuery使用的14个方面
2014/09/01 Javascript
js实现鼠标经过时图片滚动停止的方法
2015/02/16 Javascript
AngularJS 指令详细介绍
2016/07/27 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
2016/09/27 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
微信小程序实现签到功能
2018/10/31 Javascript
Nodejs实现图片上传、压缩预览、定时删除功能
2019/10/25 NodeJs
Vue 的 v-model用法实例
2020/11/23 Vue.js
jQuery实现穿梭框效果
2021/01/19 jQuery
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
Python 文件管理实例详解
2015/11/10 Python
Scrapy-Redis结合POST请求获取数据的方法示例
2019/05/07 Python
python实现梯度下降算法的实例详解
2020/08/17 Python
Python pysnmp使用方法及代码实例
2020/08/24 Python
将HTML5 Canvas的内容保存为图片借助toDataURL实现
2013/05/20 HTML / CSS
日本AOKI官方商城:AOKI西装
2020/06/11 全球购物
小学校长先进事迹材料
2014/05/13 职场文书
2014国庆节标语口号
2014/09/19 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书
2016教师给学生的毕业寄语
2015/12/04 职场文书
SQL实现LeetCode(178.分数排行)
2021/08/04 MySQL