简单了解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判断端口是否打开的实现代码
Feb 10 Python
python实现的一个p2p文件传输实例
Jun 04 Python
简单讲解Python中的闭包
Aug 11 Python
彻底理解Python list切片原理
Oct 27 Python
Python的SimpleHTTPServer模块用处及使用方法简介
Jan 22 Python
Python生成短uuid的方法实例详解
May 29 Python
python如何给字典的键对应的值为字典项的字典赋值
Jul 05 Python
python实现12306登录并保存cookie的方法示例
Dec 17 Python
Tensorflow tensor 数学运算和逻辑运算方式
Jun 30 Python
django template实现定义临时变量,自定义赋值、自增实例
Jul 12 Python
Django Model层F,Q对象和聚合函数原理解析
Nov 12 Python
Python pandas求方差和标准差的方法实例
Aug 04 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
德生PL990的分析评价
2021/03/02 无线电
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
PHP实现多图上传(结合uploadify插件)思路分析
2016/11/30 PHP
stripos函数知识点实例分享
2019/02/11 PHP
jquery简单体验
2007/01/10 Javascript
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
javascript实现日期格式转换
2014/12/16 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
ajax +NodeJS 实现图片上传实例
2017/06/06 NodeJs
jQuery实现选中行变色效果(实例讲解)
2017/07/06 jQuery
Nginx 配置多站点vhost 的方法
2018/01/07 Javascript
浅谈Redux中间件的实践
2018/07/27 Javascript
Vue下拉框回显并默认选中随机问题
2018/09/06 Javascript
JavaScript封闭函数及常用内置对象示例
2019/05/13 Javascript
angular组件间通讯的实现方法示例
2020/05/07 Javascript
使用Vue实现一个树组件的示例
2020/11/06 Javascript
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
详解Python中使用base64模块来处理base64编码的方法
2016/07/01 Python
Python做简单的字符串匹配详解
2017/03/21 Python
Python处理Excel文件实例代码
2017/06/20 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
pytorch+lstm实现的pos示例
2020/01/14 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
美国家用电器和电子产品商店:Abt
2016/09/06 全球购物
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
Fox Racing英国官网:越野摩托车和山地自行车服装
2020/02/26 全球购物
法人代表委托书
2014/04/04 职场文书
求职者怎样写自荐信
2014/04/13 职场文书
公司承诺函范文
2015/01/21 职场文书
红色故事汇观后感
2015/06/18 职场文书
2019年最新证婚词精选集!
2019/06/28 职场文书
导游词之天津盘山
2019/11/01 职场文书
nginx简单配置多个server的方法
2021/03/31 Servers
mysql 生成连续日期及变量赋值
2022/03/20 MySQL