简单了解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装饰器使用方法实例
Nov 21 Python
Python中的异常处理相关语句基础学习笔记
Jul 11 Python
解决uWSGI的编码问题详解
Mar 24 Python
django反向解析URL和URL命名空间的方法
Jun 05 Python
Python对切片命名的实现方法
Oct 16 Python
在PyCharm导航区中打开多个Project的关闭方法
Jan 17 Python
基于python历史天气采集的分析
Feb 14 Python
用python3 urllib破解有道翻译反爬虫机制详解
Aug 14 Python
numpy.array 操作使用简单总结
Nov 08 Python
pytorch中的自定义反向传播,求导实例
Jan 06 Python
TensorFlow梯度求解tf.gradients实例
Feb 04 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
May 20 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
MYSQL数据库初学者使用指南
2006/11/16 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
jQuery使用手册之 事件处理
2007/03/24 Javascript
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
javascript实现3D变换的立体圆圈实例
2015/08/06 Javascript
AngularJs实现ng1.3+表单验证
2015/12/10 Javascript
Javascript实现单例模式
2016/01/24 Javascript
基于javascript制作经典传统的拼图游戏
2016/03/22 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
关于jQuery库冲突的完美解决办法
2017/05/20 jQuery
js 取消页面可以选中文字的功能方法
2018/01/02 Javascript
vue实现短信验证码输入框
2020/04/17 Javascript
[36:05]完美世界DOTA2联赛循环赛 Forest vs DM 第一场 11.06
2020/11/06 DOTA
Python记录详细调用堆栈日志的方法
2015/05/05 Python
python迭代器与生成器详解
2016/03/10 Python
Python 使用PIL numpy 实现拼接图片的示例
2018/05/08 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
2019/08/29 Python
PyTorch预训练的实现
2019/09/18 Python
Python zip函数打包元素实例解析
2019/12/11 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
2020/06/30 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
2014/04/10 HTML / CSS
英国Office鞋店德国网站:在线购买鞋子、靴子和运动鞋
2018/12/19 全球购物
手工制作的豪华英式沙发和沙发床:Willow & Hall
2019/05/03 全球购物
汽车维修专业毕业生的求职信分享
2013/12/04 职场文书
课程设计心得体会
2013/12/28 职场文书
开学寄语大全
2014/04/08 职场文书
护士求职自荐信
2015/03/25 职场文书
2015年安置帮教工作总结
2015/05/22 职场文书
商务宴会祝酒词
2015/08/11 职场文书
小学科学课教学反思
2016/02/23 职场文书
导游词之寿县报恩寺
2020/01/19 职场文书
python数据处理之Pandas类型转换
2022/04/28 Python
MySQL脏读,幻读和不可重复读
2022/05/11 MySQL