简单了解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 相关文章推荐
记录Django开发心得
Jul 16 Python
在Django的模型和公用函数中使用惰性翻译对象
Jul 27 Python
python3 kmp 字符串匹配的方法
Jul 07 Python
python数据处理 根据颜色对图片进行分类的方法
Dec 08 Python
Python函数的参数常见分类与用法实例详解
Mar 30 Python
Python批量删除只保留最近几天table的代码实例
Apr 01 Python
pip安装python库的方法总结
Aug 02 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
Aug 28 Python
python中time库的实例使用方法
Oct 31 Python
Django xadmin开启搜索功能的实现
Nov 15 Python
jupyter notebook清除输出方式
Apr 10 Python
Python实现LR1文法的完整实例代码
Oct 25 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验证信用卡卡号是否正确函数
2015/05/27 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
几个有趣的Javascript Hack
2010/07/24 Javascript
js中的replace方法使用介绍
2013/10/28 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
使用jquery animate创建平滑滚动效果(可以是到顶部、到底部或指定地方)
2014/05/27 Javascript
jQuery实现跟随鼠标运动图层效果的方法
2015/02/02 Javascript
Node.js实现数据推送
2016/04/14 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
Bootstrap响应式表格详解
2017/05/23 Javascript
jQuery获取随机颜色的实例代码
2018/05/21 jQuery
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
微信小程序引入Vant组件库过程解析
2019/08/06 Javascript
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
通过PHP与Python代码对比的语法差异详解
2019/07/10 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
python如何基于redis实现ip代理池
2020/01/17 Python
澳大利亚领先的亚麻品牌:Bed Threads
2019/12/16 全球购物
中科前程Java笔试题
2016/11/20 面试题
opencv实现图像平移效果
2021/03/24 Python
军训自我鉴定
2013/12/14 职场文书
文明礼仪事迹材料
2014/01/09 职场文书
2014年迎新年联欢会活动策划方案
2014/02/26 职场文书
意向协议书范本
2014/04/23 职场文书
领导干部作风建设剖析材料
2014/10/11 职场文书
2014年业务工作总结
2014/11/17 职场文书
运动会800米赞词
2015/07/22 职场文书
《静夜思》教学反思
2016/02/17 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书
2016年学校党支部创先争优活动总结
2016/04/05 职场文书