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使用新浪微博API发送微博的例子
Apr 10 Python
python使用xauth方式登录饭否网然后发消息
Apr 11 Python
Python实现的一个找零钱的小程序代码分享
Aug 25 Python
python机器学习理论与实战(五)支持向量机
Jan 19 Python
Python实现识别手写数字大纲
Jan 29 Python
django静态文件加载的方法
May 20 Python
学生信息管理系统Python面向对象版
Jan 30 Python
PyCharm第一次安装及使用教程
Jan 08 Python
python3爬取torrent种子链接实例
Jan 16 Python
Python3实现mysql连接和数据框的形成(实例代码)
Jan 17 Python
Python 实现黑客帝国中的字符雨的示例代码
Feb 20 Python
Python的代理类实现,控制访问和修改属性的权限你都了解吗
Mar 21 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
德劲1102收音机的打理维修案例
2021/03/02 无线电
解析wamp5下虚拟机配置文档
2013/06/27 PHP
10 个经典PHP函数
2013/10/17 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
javascript 面向对象编程基础:封装
2009/08/21 Javascript
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
原生js实现淘宝首页点击按钮缓慢回到顶部效果
2014/04/06 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
2015/03/05 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
jQuery实现简单下拉导航效果
2015/09/07 Javascript
javascript的列表切换【实现代码】
2016/05/03 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
5分钟打造简易高效的webpack常用配置
2017/07/04 Javascript
微信小程序input框中加入小图标的实现方法
2018/06/19 Javascript
解决layui富文本编辑器图片上传无法回显的问题
2019/09/18 Javascript
vue实现表格过滤功能
2019/09/27 Javascript
不可错过的十本Python好书
2017/07/06 Python
Python面向对象之继承代码详解
2018/01/29 Python
python实现读Excel写入.txt的方法
2018/04/29 Python
Python之inspect模块实现获取加载模块路径的方法
2018/10/16 Python
Django跨域请求CSRF的方法示例
2018/11/11 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
python或C++读取指定文件夹下的所有图片
2019/08/31 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
如何给HTML标签中的文本设置修饰线
2019/11/18 HTML / CSS
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
天网面试题
2013/04/07 面试题
我的求职计划书
2014/01/10 职场文书
知名企业招聘广告词大全
2014/03/18 职场文书
2014年安全生产大检查方案
2014/05/13 职场文书
公司租车协议书
2015/01/29 职场文书
中学团支部工作总结
2015/08/13 职场文书
化工生产实习心得体会
2016/01/22 职场文书
浅谈MySQL中的六种日志
2022/03/23 MySQL
Android开发之WECHAT微信小程序路由跳转的两种形式
2022/04/12 Java/Android