简单了解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连接mysql并提交mysql事务示例
Mar 05 Python
Python解析xml中dom元素的方法
Mar 12 Python
在Python中使用Mako模版库的简单教程
Apr 08 Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
Feb 13 Python
python实现内存监控系统
Mar 07 Python
Python实现的各种常见分布算法示例
Dec 13 Python
python实现小球弹跳效果
May 10 Python
python 多进程共享全局变量之Manager()详解
Aug 15 Python
python实现人工智能Ai抠图功能
Sep 05 Python
Django项目使用ckeditor详解(不使用admin)
Dec 17 Python
简单了解为什么python函数后有多个括号
Dec 19 Python
Python time库的时间时钟处理
May 02 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数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
PHP删除数组中的特定元素的代码
2012/06/28 PHP
php浏览历史记录的方法
2015/03/10 PHP
php用正则判断是否为数字的方法
2016/03/25 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
PHP $O00OO0=urldecode & eval 解密,记一次商业源码的去后门
2020/09/13 PHP
jQuery EasyUI API 中文文档 DateTimeBox日期时间框
2011/10/16 Javascript
浅析JavaScript中的类型和对象
2013/11/29 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
基于Jquery和CSS3制作数字时钟附源码下载(CSS3篇)
2015/11/24 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
浅谈使用splice函数对数组中的元素进行删除时的注意事项
2016/12/04 Javascript
关于AngularJs数据的本地存储详解
2017/01/20 Javascript
JavaScript与JQUERY获取元素的宽、高和位置
2017/02/26 Javascript
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
2018/12/05 Javascript
JavaScript变量提升和严格模式实例分析
2019/01/27 Javascript
JS html事件冒泡和事件捕获操作示例
2019/05/01 Javascript
Fetch超时设置与终止请求详解
2019/05/18 Javascript
vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】
2020/03/06 Javascript
JS常见错误(Error)及处理方案详解
2020/07/02 Javascript
Python3实现的腾讯微博自动发帖小工具
2013/11/11 Python
名片管理系统python版
2018/01/11 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
python ffmpeg任意提取视频帧的方法
2020/02/21 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
纽约香氛品牌:NEST Fragrance
2018/10/15 全球购物
伦敦著名的运动鞋综合商店:Footpatrol
2019/03/25 全球购物
中文系师范生自荐信
2013/10/01 职场文书
高级工程师英文求职信
2014/03/19 职场文书
五年级学生评语
2014/04/22 职场文书
公司周年庆活动方案
2014/08/25 职场文书
单位工作证明书格式
2014/10/04 职场文书
酒店开业主持词
2015/07/02 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers
MySQL限制查询和数据排序介绍
2022/03/25 MySQL