简单了解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实现面向对像的ASP程序实例
Nov 10 Python
python静态方法实例
Jan 14 Python
在Apache服务器上同时运行多个Django程序的方法
Jul 22 Python
python3实现基于用户的协同过滤
May 31 Python
Selenium的使用详解
Oct 19 Python
pytorch使用Variable实现线性回归
May 21 Python
详解Python3 中的字符串格式化语法
Jan 15 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
May 20 Python
pandas 像SQL一样使用WHERE IN查询条件说明
Jun 05 Python
Python 爬取淘宝商品信息栏目的实现
Feb 06 Python
python中time tzset()函数实例用法
Feb 18 Python
关于Numpy之repeat、tile的用法总结
Jun 02 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应用JSON技巧讲解
2013/02/03 PHP
Laravel 4 初级教程之Pages、表单验证
2014/10/30 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
Laravel 关联模型-关联新增和关联更新的方法
2019/10/10 PHP
零基础php编程好学吗
2019/10/11 PHP
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
JSON为什么那样红为什么要用json(另有洞天)
2012/12/26 Javascript
jquery实现控制表格行高亮实例
2013/06/05 Javascript
JavaScript回调(callback)函数概念自我理解及示例
2013/07/04 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
2014/11/26 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
2016/01/28 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
js实现水平滚动菜单导航
2017/07/21 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
vue-cli脚手架打包静态资源请求出错的原因与解决
2019/06/06 Javascript
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
Vue结合路由配置递归实现菜单栏功能
2020/06/16 Javascript
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
通过C++学习Python
2015/01/20 Python
Python中使用异常处理来判断运行的操作系统平台方法
2015/01/22 Python
在django admin详情表单显示中添加自定义控件的实现
2020/03/11 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
2020/03/12 Python
如何在python中执行另一个py文件
2020/04/30 Python
Windows下Sqlmap环境安装教程详解
2020/08/04 Python
python matlab库简单用法讲解
2020/12/31 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
Expedia印度:您的一站式在线旅游网站
2017/08/24 全球购物
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
超市开店计划书
2014/04/26 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
辩护意见书
2015/06/04 职场文书
花木兰观后感
2015/06/10 职场文书
2016年小学六一儿童节活动总结
2016/04/06 职场文书
学习师德师风的心得体会(2篇)
2019/10/08 职场文书