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 相关文章推荐
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
Jan 22 Python
python下实现二叉堆以及堆排序的示例
Sep 29 Python
Python用sndhdr模块识别音频格式详解
Jan 11 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
详解Python数据分析--Pandas知识点
Mar 23 Python
简单了解python代码优化小技巧
Jul 08 Python
用python3 urllib破解有道翻译反爬虫机制详解
Aug 14 Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 Python
pytorch 准备、训练和测试自己的图片数据的方法
Jan 10 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
Jan 20 Python
解决 jupyter notebook 回车换两行问题
Apr 15 Python
python自动化测试三部曲之request+django实现接口测试
Oct 07 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
德生PL450的电路分析和低放电路的改进办法
2021/03/02 无线电
php 归并排序 数组交集
2011/05/10 PHP
JS this作用域以及GET传输值过长的问题解决方法
2013/08/06 Javascript
js解决弹窗问题实现班级跳转DIV示例
2014/01/06 Javascript
简单的JavaScript互斥锁分享
2014/02/02 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
jquery实现的代替传统checkbox样式插件
2015/06/19 Javascript
Sublime Text 3常用插件及安装方法
2015/12/16 Javascript
jQuery 跨域访问解决原理案例详解
2016/07/09 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
2016/08/05 Javascript
js严格模式总结(分享)
2016/08/22 Javascript
jQuery+pjax简单示例汇总
2017/04/21 jQuery
Vue中img的src属性绑定与static文件夹实例
2017/05/18 Javascript
vue-cli项目配置多环境的详细操作过程
2018/10/30 Javascript
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
2019/07/04 Javascript
微信小程序左滑删除实现代码实例
2019/09/16 Javascript
Vue 修改网站图标的方法
2020/12/31 Vue.js
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
[01:36]极致酷炫!TI9典藏宝瓶+撼地者至宝展示
2019/06/11 DOTA
Python的Django框架中从url中捕捉文本的方法
2015/07/20 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
2016/07/08 Python
Python 基础教程之闭包的使用方法
2017/09/29 Python
python+selenium实现登录账户后自动点击的示例
2017/12/22 Python
django的ORM操作 增加和查询
2019/07/26 Python
Flask框架单例模式实现方法详解
2019/07/31 Python
python 发送json数据操作实例分析
2019/10/15 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
医院领导班子四风对照检查材料
2014/09/27 职场文书
2014年敬老院工作总结
2014/12/08 职场文书
四年级学生期末评语
2014/12/26 职场文书
离职证明范本
2015/06/12 职场文书
演讲比赛主持词
2015/06/29 职场文书
九不准学习心得体会
2016/01/23 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
Python基础之元组与文件知识总结
2021/05/19 Python