简单了解python列表和元组的区别


Posted in Python onMay 14, 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中使用HTMLParser解析html实例
Feb 08 Python
Python中关于使用模块的基础知识
May 24 Python
Python 爬虫的工具列表大全
Jan 31 Python
基于Python实现对PDF文件的OCR识别
Aug 05 Python
基于Python的关键字监控及告警
Jul 06 Python
深入探究Django中的Session与Cookie
Jul 30 Python
Python实现可自定义大小的截屏功能
Jan 20 Python
基于python log取对数详解
Jun 08 Python
在PyCharm下打包*.py程序成.exe的方法
Nov 29 Python
基于Python执行dos命令并获取输出的结果
Dec 30 Python
在pycharm中关掉ipython console/PyDev操作
Jun 09 Python
Pycharm配置autopep8实现流程解析
Nov 28 Python
Django 解决阿里云部署同步数据库报错的问题
May 14 #Python
Python参数传递实现过程及原理详解
May 14 #Python
Django模板标签{% for %}循环,获取制定条数据实例
May 14 #Python
详解python中groupby函数通俗易懂
May 14 #Python
django 解决扩展自带User表遇到的问题
May 14 #Python
解决更改AUTH_USER_MODEL后出现的问题
May 14 #Python
Python基于numpy模块实现回归预测
May 14 #Python
You might like
解析PHP处理换行符的问题 \r\n
2013/06/13 PHP
php实现高效获取图片尺寸的方法
2014/12/12 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
2016/06/13 PHP
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
2012/02/27 Javascript
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
使用jquery实现div的tab切换实例代码
2013/05/27 Javascript
javascript垃圾收集机制与内存泄漏详细解析
2013/11/11 Javascript
JavaScript动态修改网页元素内容的方法
2015/03/21 Javascript
JQuery实现可直接编辑的表格
2015/04/16 Javascript
很不错的两款Bootstrap Icon图标选择组件
2016/01/28 Javascript
jQuery插件制作的实例教程
2016/05/16 Javascript
第一次接触神奇的Bootstrap菜单和导航
2016/08/01 Javascript
基于Vue如何封装分页组件
2016/12/16 Javascript
layui导航栏实现代码
2017/05/19 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
2017/08/08 jQuery
jQuery实现的点击按钮改变样式功能示例
2018/07/21 jQuery
详解vue-cli3使用
2018/08/14 Javascript
解决vue-cli项目webpack打包后iconfont文件路径的问题
2018/09/01 Javascript
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
2019/01/07 Javascript
js中对象和面向对象与Json介绍
2019/01/21 Javascript
JavaScript设计模式之门面模式原理与实现方法分析
2020/03/09 Javascript
[04:16]完美世界DOTA2联赛PWL S2 集锦第一期
2020/11/23 DOTA
使用实现pandas读取csv文件指定的前几行
2018/04/20 Python
Python生成器generator用法示例
2018/08/10 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
PyQt5实现简单的计算器
2020/05/30 Python
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
幼师自荐信范文
2013/10/06 职场文书
机电一体化应届生求职信
2014/08/09 职场文书
男方婚前保证书
2015/02/28 职场文书
2016年员工年度考核评语
2015/12/02 职场文书
汽车销售合同文本
2019/08/08 职场文书
2019年汽车租赁合同范本!
2019/08/12 职场文书
Python时间操作之pytz模块使用详解
2022/06/14 Python
使用scrapy实现增量式爬取方式
2022/06/21 Python