简单了解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的装饰器的运用
May 05 Python
Python urllib、urllib2、httplib抓取网页代码实例
May 09 Python
Python出现segfault错误解决方法
Apr 16 Python
python实现斐波那契数列的方法示例
Jan 12 Python
python使用Apriori算法进行关联性解析
Dec 21 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
May 24 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
Dec 28 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
Jan 17 Python
Python交互式图形编程的实现
Jul 25 Python
Golang GBK转UTF-8的例子
Aug 26 Python
Pycharm Git 设置方法
Sep 15 Python
如何在Win10系统使用Python3连接Hive
Oct 15 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方法调用模式与函数调用模式简例
2011/09/20 PHP
分享一个php 的异常处理程序
2014/06/22 PHP
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
2016/03/21 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
Javascript与jQuery方法的隐藏与显示
2015/01/19 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
2016/04/18 Javascript
JS版微信6.0分享接口用法分析
2016/10/13 Javascript
ES6新特性八:async函数用法实例详解
2017/04/21 Javascript
vue2.0+ 从插件开发到npm发布的示例代码
2018/04/28 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
[01:04:20]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.29
2020/12/02 DOTA
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
Python反转序列的方法实例分析
2018/03/21 Python
Python定时任务sched模块用法示例
2018/07/16 Python
Window环境下Scrapy开发环境搭建
2018/11/18 Python
HTML的form表单和django的form表单
2019/07/25 Python
Python range、enumerate和zip函数用法详解
2019/09/11 Python
GDAL 矢量属性数据修改方式(python)
2020/03/10 Python
Win 10下Anaconda虚拟环境的教程
2020/05/18 Python
python中什么是面向对象
2020/06/11 Python
CSS3条纹背景制作的实战攻略
2016/05/31 HTML / CSS
台湾母婴用品限时团购:妈咪爱
2018/08/03 全球购物
给幼儿园老师的表扬信
2014/01/19 职场文书
社区庆中秋节活动方案
2014/02/07 职场文书
中学学校门卫岗位职责
2014/08/15 职场文书
个人专业技术总结
2015/03/05 职场文书
求职自我推荐信
2015/03/24 职场文书
2016年圣诞节寄语(一句话)
2015/12/07 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
详解PHP Swoole与TCP三次握手
2021/05/27 PHP
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
2021/05/31 Python
gtx1650怎么样 gtx1650显卡相当于什么级别
2022/04/08 数码科技
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
2022/04/13 Java/Android