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数组遍历的简单实现方法小结
Apr 27 Python
Python实现的简单读写csv文件操作示例
Jul 12 Python
基于numpy中数组元素的切片复制方法
Nov 15 Python
深度辨析Python的eval()与exec()的方法
Mar 26 Python
python使用turtle绘制国际象棋棋盘
May 23 Python
Django框架自定义模型管理器与元选项用法分析
Jul 22 Python
postman和python mock测试过程图解
Feb 22 Python
keras做CNN的训练误差loss的下降操作
Jun 22 Python
Python程序慢的重要原因
Sep 04 Python
Python从MySQL数据库中面抽取试题,生成试卷
Jan 14 Python
Python网络编程之ZeroMQ知识总结
Apr 25 Python
基于Python绘制子图及子图刻度的变换等的问题
May 23 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三层结构(上) 简单三层结构
2010/07/04 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
JavaScript判断表单提交时哪个radio按钮被选中的方法
2015/03/21 Javascript
面向切面编程(AOP)的理解
2015/05/01 Javascript
详解JavaScript中shift()方法的使用
2015/06/09 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
js实现数组去重方法及效率?Ρ? target=
2017/02/14 Javascript
canvas雪花效果核心代码分享
2017/02/19 Javascript
nodejs 生成和导出 word的实例代码
2018/07/31 NodeJs
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
2018/10/26 jQuery
如何提升vue.js中大型数据的性能
2019/06/21 Javascript
前端天气插件tpwidget使用方法详解
2019/06/24 Javascript
JS实现横向轮播图(中级版)
2020/01/18 Javascript
python三引号输出方法
2019/02/27 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
python判断所输入的任意一个正整数是否为素数的两种方法
2019/06/27 Python
用Cython加速Python到“起飞”(推荐)
2019/08/01 Python
python做接口测试的必要性
2019/11/20 Python
Python with语句用法原理详解
2020/07/03 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
Python字符串三种格式化输出
2020/09/17 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
HTML5 canvas 瀑布流文字效果的示例代码
2018/01/31 HTML / CSS
英国高档时尚男装购物网站:MR PORTER
2016/08/09 全球购物
Book Depository亚太地区:一家领先的国际图书零售商
2019/05/05 全球购物
社区关爱留守儿童活动方案
2014/08/22 职场文书
学生抄作业检讨书(2篇)
2014/10/17 职场文书
群众路线教育实践活动调研报告
2014/11/03 职场文书
感恩父母主题班会
2015/08/12 职场文书
2016清明节森林防火广播稿
2015/12/17 职场文书
详解MySQL中的主键与事务
2021/05/27 MySQL
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python
微信小程序中使用vant框架的具体步骤
2022/02/18 Javascript