简单了解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之玩转字符串(2)
Sep 14 Python
浅谈Python中copy()方法的使用
May 21 Python
Python利用正则表达式实现计算器算法思路解析
Apr 25 Python
Django框架封装外部函数示例
May 28 Python
Python实现Restful API的例子
Aug 31 Python
python实现复制文件到指定目录
Oct 16 Python
python数据化运营的重要意义
Nov 25 Python
关于Tensorflow使用CPU报错的解决方式
Feb 05 Python
通过python检测字符串的字母
Feb 18 Python
python中数据库like模糊查询方式
Mar 02 Python
Python参数传递及收集机制原理解析
Jun 05 Python
python热力图实现的完整实例
Jun 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 parse_url 一个好用的函数
2009/10/03 PHP
用PHP将数据导入到Foxmail的实现代码
2010/09/05 PHP
php实现水仙花数示例分享
2014/04/03 PHP
php+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
解决jquery插件冲突的问题
2014/01/23 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
Javascript获取当前日期的农历日期代码
2014/10/08 Javascript
js实现div层缓慢收缩与展开的方法
2015/05/11 Javascript
JavaScript实现斗地主游戏的思路
2016/02/29 Javascript
浅析JSONP技术原理及实现
2016/06/08 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
2017/02/08 Javascript
vue.js实现简单轮播图效果
2017/10/10 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
Vue表单控件绑定图文详解
2019/02/11 Javascript
js+springMVC 提交数组数据到后台的实例
2019/09/21 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
vue cli3.0打包上线静态资源找不到路径的解决操作
2020/08/03 Javascript
Python单元测试框架unittest使用方法讲解
2015/04/13 Python
Python使用urllib2模块实现断点续传下载的方法
2015/06/17 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
Python 实现文件读写、坐标寻址、查找替换功能
2019/09/11 Python
python socket 聊天室实例代码详解
2019/11/14 Python
Python jieba结巴分词原理及用法解析
2020/11/05 Python
Europcar英国:英国汽车和货车租赁
2017/01/21 全球购物
Lookfantastic德国官网:英国知名美妆购物网站
2017/06/11 全球购物
爱他美官方海外旗舰店:Aptamil奶粉
2017/12/22 全球购物
NYX Professional Makeup官方网站:专业彩妆和美容产品
2019/10/29 全球购物
自荐信格式简述
2014/01/25 职场文书
远程培训的心得体会
2014/09/01 职场文书
学校师德师风整改措施
2014/10/27 职场文书
新郎新娘答谢词
2015/01/04 职场文书
《没有任何借口》读后感:完美的执行能力
2020/01/07 职场文书