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冒泡排序算法的实现代码
Nov 21 Python
Python切片用法实例教程
Sep 08 Python
深入讲解Python中面向对象编程的相关知识
May 25 Python
Python中字符串的常见操作技巧总结
Jul 28 Python
Python实现小数转化为百分数的格式化输出方法示例
Sep 20 Python
Django中间件实现拦截器的方法
Jun 01 Python
pygame游戏之旅 如何制作游戏障碍
Nov 20 Python
pyqt5 QlistView列表显示的实现示例
Mar 24 Python
pytorch 限制GPU使用效率详解(计算效率)
Jun 27 Python
Python gevent协程切换实现详解
Sep 14 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
Nov 27 Python
python中Tkinter 窗口之输入框和文本框的实现
Apr 12 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 mysql与mysqli事务使用说明 分享
2013/08/17 PHP
Windows7下的php环境配置教程
2015/02/28 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
2015/08/21 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
解决Laravel 不能创建 migration 的问题
2019/10/09 PHP
一段非常简单的让图片自动切换js代码
2006/11/10 Javascript
utf8的编码算法 转载
2006/12/27 Javascript
js cookies 常见网页木马挂马代码 24小时只加载一次
2009/04/13 Javascript
javascript学习笔记(十九) 节点的操作实现代码
2012/06/20 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
2016/09/24 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容
2017/06/17 Javascript
vue生成随机验证码的示例代码
2017/09/29 Javascript
极简主义法编写JavaScript类
2017/11/02 Javascript
vue根据值给予不同class的实例
2018/09/29 Javascript
webpack开发环境和生产环境的深入理解
2018/11/08 Javascript
Vue 实现前端权限控制的示例代码
2019/07/09 Javascript
vue+ts下对axios的封装实现
2020/02/18 Javascript
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
[48:48]完美世界DOTA2联赛PWL S3 Magama vs GXR 第一场 12.19
2020/12/24 DOTA
Python异常学习笔记
2015/02/03 Python
Python实现Linux中的du命令
2017/06/12 Python
django项目运行因中文而乱码报错的几种情况解决
2017/11/07 Python
python高级特性和高阶函数及使用详解
2018/10/17 Python
Python读取yaml文件的详细教程
2020/07/21 Python
科颜氏法国官网:Kiehl’s法国
2019/08/20 全球购物
写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)
2014/09/05 面试题
创建学习型党组织实施方案
2014/03/29 职场文书
缓刑人员思想汇报500字
2014/09/12 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
业务员岗位职责
2015/02/03 职场文书
2015年重阳节慰问信
2015/03/23 职场文书
初中英语教学随笔
2015/08/15 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
Django操作cookie的实现
2021/05/26 Python