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 相关文章推荐
Django中传递参数到URLconf的视图函数中的方法
Jul 18 Python
Python lambda函数基本用法实例分析
Mar 16 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
Jun 13 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
Dec 02 Python
用python代码将tiff图片存储到jpg的方法
Dec 04 Python
Python lambda表达式用法实例分析
Dec 25 Python
python使用PIL实现多张图片垂直合并
Jan 15 Python
Django使用中间键实现csrf认证详解
Jul 22 Python
python关闭占用端口方式
Dec 17 Python
Python获取对象属性的几种方式小结
Mar 12 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
Apr 19 Python
Python 通过监听端口实现唯一脚本运行方式
May 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
如何实现给定日期的若干天以后的日期
2006/10/09 PHP
php判断正常访问和外部访问的示例
2014/02/10 PHP
Zend Framework教程之Autoloading用法详解
2016/03/08 PHP
PHP实现登录注册之BootStrap表单功能
2017/09/03 PHP
javascript显示隐藏层比较不错的方法分析
2008/09/30 Javascript
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
jQuery实现单行文字间歇向上滚动源代码
2013/06/02 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
详解NodeJs支付宝移动支付签名及验签
2017/01/06 NodeJs
jQuery获取所有父级元素及同级元素及子元素的方法(推荐)
2018/01/21 jQuery
微信小程序实现复选框效果
2018/12/28 Javascript
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
基于JS实现一个随机生成验证码功能
2019/05/29 Javascript
Vue-Cli项目优化操作的实现
2019/10/27 Javascript
python3实现短网址和数字相互转换的方法
2015/04/28 Python
python+pyqt实现右下角弹出框
2017/10/26 Python
详解Python在七牛云平台的应用(一)
2017/12/05 Python
Python设计模式之中介模式简单示例
2018/01/09 Python
django在接受post请求时显示403forbidden实例解析
2018/01/25 Python
使用python语言,比较两个字符串是否相同的实例
2018/06/29 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
python实现二维插值的三维显示
2018/12/17 Python
python json.loads兼容单引号数据的方法
2018/12/19 Python
Python设计模式之模板方法模式实例详解
2019/01/17 Python
Python中如何导入类示例详解
2019/04/17 Python
用python进行视频剪辑
2020/11/02 Python
详解python中的异常捕获
2020/12/15 Python
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
美国酒店控股公司:Choice Hotels
2018/06/15 全球购物
.NET是怎么支持多种语言的
2015/02/24 面试题
商场中秋节广播稿
2014/01/17 职场文书
党的群众路线查摆剖析材料
2014/10/10 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
Python编程源码报错解决方法总结经验分享
2021/10/05 Python