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之模块的加载
Oct 24 Python
Python实现矩阵转置的方法分析
Nov 24 Python
Python数据结构之栈、队列的实现代码分享
Dec 04 Python
详解如何用django实现redirect的几种方法总结
Nov 22 Python
用Python写一个模拟qq聊天小程序的代码实例
Mar 06 Python
python爬虫项目设置一个中断重连的程序的实现
Jul 26 Python
python实现对列表中的元素进行倒序打印
Nov 23 Python
在Tensorflow中实现leakyRelu操作详解(高效)
Jun 30 Python
Python基于pyjnius库实现访问java类
Jul 31 Python
Python实现像awk一样分割字符串
Sep 15 Python
Python 列表推导式需要注意的地方
Oct 23 Python
基于Python的接口自动化读写excel文件的方法
Jan 15 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
PHP写的求多项式导数的函数代码
2012/07/04 PHP
二级域名转向类
2006/11/09 Javascript
JavaScript 学习笔记(五)
2009/12/31 Javascript
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
JavaScript高级程序设计 阅读笔记(十二) js内置对象Math
2012/08/14 Javascript
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
js/jQuery对象互转(快速操作dom元素)
2013/02/04 Javascript
JavaScript中诡异的delete操作符
2015/03/12 Javascript
angularjs学习笔记之双向数据绑定
2015/09/26 Javascript
Bootstrap的class样式小结
2016/12/01 Javascript
JavaScript获取键盘按键的键码(参照表)
2017/01/10 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
微信通过页面(H5)直接打开本地app的解决方法
2017/09/09 Javascript
js+css实现红包雨效果
2018/07/12 Javascript
详解Vue组件之间通信的七种方式
2019/04/14 Javascript
JS实现水平遍历和嵌套递归操作示例
2019/08/15 Javascript
JavaScript实现瀑布流布局的3种方式
2020/12/27 Javascript
详解template标签用法(含vue中的用法总结)
2021/01/12 Vue.js
Python深入学习之闭包
2014/08/31 Python
python格式化字符串实例总结
2014/09/28 Python
linux下python抓屏实现方法
2015/05/22 Python
Python 模拟购物车的实例讲解
2017/09/11 Python
数据清洗--DataFrame中的空值处理方法
2018/07/03 Python
Python wxPython库使用wx.ListBox创建列表框示例
2018/09/03 Python
对python csv模块配置分隔符和引用符详解
2018/12/12 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
python openpyxl使用方法详解
2019/07/18 Python
浅谈Python type的使用
2019/11/19 Python
python推导式的使用方法实例
2021/02/28 Python
HTML5 图片悬停放大的实现代码示例
2019/12/04 HTML / CSS
软件测试工程师笔试题带答案
2015/03/27 面试题
《值日生》教学反思
2014/02/17 职场文书
连带责任保证书
2014/04/29 职场文书
家长通知书家长意见
2014/12/30 职场文书
加薪申请报告范本
2015/05/15 职场文书
单位车辆管理制度
2015/08/05 职场文书