深入理解python之二——python列表和元组

从一开始学习python的时候,很多人就听到的是元组和列表差不多,区别就是元组不可以改变,列表可以改变。

从数据结构来说,这两者都应当属于数组,元组属于静态的数组,而列表属于动态数组。稍后再内存的分配上也会体现这一点。对于这两种类型,除了能接受相同类型的值之外,也接受混合类型的值。

元组

说元组不能改变的,其实只是看到了操作结果显示出来的表面现象。可以来看一下下列的操作(输出结果截去了相同的高几位)。

a = (1,2,3)
b = (1,2,3)
c = a+b
id(a)
>>>71845752
id(b)
>>>99964864
id(c)
>>>97883880

这样的结果意味着,对于元组,即便元组组成的值是相同的,每次绑定一个变量都是重新开辟空间生成一个新的。在执行a+b的元组组合操作时,也是在重新创建一个新的元组,而不是在前一个的基础上拼接的。也就是说所有的内容都会被复制一份,所以这里的复杂度不是O(1),而是O(n)。

此外,元组还有一个额外要注意的细节。在《Python高性能编程》一书中作者提到了1-20长度的小元组在被回收之后不会返还给操作系统处理,而是在程序内保留。这一细节可能是根据python2.7来说的,对于python3.x版本未验证。元组一般会缓存在Python的运行时环境中,使用的时候不用去访问内核来分配内存。

列表

列表主要的操作时增删,切片,查找,排序。前两者依赖于列表的组织结构。由于列表是可变的,所以列表除了本身的数据之外,每个数据单元还会额外消耗一个单位的单元用于保存结构信息,以便列表进行重新调整大小。所以假如同样保存10W数据,列表实际占用的数据单元是远大于10W这个数。

对于列表的增加,主要是一个append()方法,涉及一个动态申请空间的算法。每次使用.append()操作的时候就会申请空间,申请总是按照一定的算法申请远不止一个空间,便于接下来的扩展。这点在初学数据结构的时候可能都会知道,一次申请最好申请一个差不多的,这要比一个一个申请更有效,不过具体数量是多少,这可能是一个奥卡姆剃刀的问题。预测式的空间申请算法,会带来一定的额外空间开销。

列表的.index()方法提供了一种搜索调用,但它的实现是线性搜索,效率并不高。

列表的排序方法使用的是Tim排序,相对来说是一种比较好的实现。

列表在加载的时候,相对于元组的速度也是慢了许多。

最后

对于两者其实都可以通过自己编写安排引入算法来进行搜索或排序。如果自己编写有点困难,也可以借助内建的bisect模块。

原文地址:https://www.cnblogs.com/xiao3c/p/9629220.html

时间: 2024-10-09 20:56:16

深入理解python之二——python列表和元组的相关文章

Python学习笔记<二>:列表、元组、字典

1 列表和元组 可以将列表和元组当成普通的"数组",它能保存任意数量任意类型的Python 对象.和数组一样,通过从0 开始的数字索引访问元素,但是列表和元组可以存储不同类型的对象. 列表和元组有几处重要的区别.列表元素用中括号( [ ])包裹,元素的个数及元素的值可以改变.元组元素用小括号(( ))包裹,不可以更改(尽管他们的内容可以).元组可以看成是只读的列表.通过切片运算( [ ] 和 [ : ] )可以得到子集,这一点与字符串的使用方法一样. 举例如下: >>>

python基本数据类型之列表和元组(一)

python基本数据类型之列表与元组(一) python中list与tuple都是可以遍历类型.不同的是,list是可以修改的,而元组属于不可变类型,不能修改. 列表和元组中的元素可以是任意类型,并且同一个列表和元组中可以包含多种类型的元素. list中有很多内置方法,元组由于不能修改,所以只有两个方法(count.index). 列表的内置方法 list的内置方法有:append.clear.copy.count.extend.index.insert.pop.remove和sort. 1.添

python构造二维列表以及排序字典

1. 构造二维列表: 比如我现在需要一个100*100的二维列表: a = [] for i in range(100): a.append([]) for j in range(100): a[i].append(data) # 这里插入列表元素的值 2. 排序字典: 比如我现在想要python的字典全部按键排序存放: from collections import OrderedDict d = OrderedDict() d['c'] = 1 d['k'] = 2 d['z'] = 3 d

.Net程序员之Python基础教程学习----列表和元组 [First Day]

一. 通用序列操作: 其实对于列表,元组 都属于序列化数据,可以通过下表来访问的.下面就来看看序列的基本操作吧. 1.1 索引: 序列中的所有元素的下标是从0开始递增的. 如果索引的长度的是N,那么所以的范围是-N~N-1之间,超过这个范围就会提示 IndexError:  index out of range >>> greeting ='Hello world' >>> print greeting Hello world >>> print gr

python学习笔记之列表与元组

一.概述 python包含6种内建的序列,其中列表和元组是最常用的两种类型.列表和元组的主要区别在于,列表可以修改,元组则不能修改 使用上,如果要根据要求来添加元素,应当使用列表:而由于要求序列不可修改时,此时使用元组更合适 一般来说,几乎可以用列表代替元组 二.通用操作 所有序列类型都可以进行某些特定的操作,包括:索引.切片.加.乘以及检查元素是否属于序列 1.索引 序列中的所有元素同PHP Array一样都有编号,而且这个编号从0开始,可以通过这个编号来访问元素 字符串也是一个由字符组成的序

Python【2】-列表和元组

一.序列 python包含六种内建的序列:列表.元组.字符串.unicode字符串.buffer对象.xrange对象. 列表可以修改,元组是不能修改的. 二.列表 列表list是变长序列,其中的内容也是可以修改的.序列通过方括号[]或者list函数进行定义,而且序列中还可以嵌套包含序列. >>> a=['wang',15]>>> print a['wang', 15]>>> b=['chen',18]>>> print b['che

《Python高性能编程》——列表、元组、集合、字典特性及创建过程

这里的内容仅仅是本人阅读<Python高性能编程>后总结的一些知识,用于自己更好的了解Python机制.本人现在并不从事计算密集型工作:人工智能.数据分析等.仅仅只是出于好奇而去阅读这本书.很多人因为Python不能同时使用多颗CPU(全局解释器锁GIL),而觉得它不能实现高性能.书中有很多介绍避开GIL或者Python虚拟机的方式,例如Cython,PyPy等. 首先我们要说一下时间复杂度,可以帮助我们理解CPython编译器怎么干活: 时间复杂度 在描述算法复杂度时,经常用到o(1), o

python基础--字符串、列表、元组、字典

一.下标和切片 所谓“下标”,就是编号,就好比超市中的存储柜的编号,通过这个编号就能找到相应的存储空间 列表与元组支持下标索引好理解,字符串实际上就是字符的数组,所以也支持下标索引. 如果想取出部分字符,那么可以通过下标的方法,(注意python中下标从 0 开始) 切片是指对操作的对象截取其中一部分的操作.字符串.列表.元组都支持切片操作. 切片的语法:[起始:结束:步长] 注意:选取的区间从"起始"位开始,到"结束"位的前一位结束(不包含结束位本身),步长表示选

python学习笔记之列表、元组、字典(1)

1.最基本的数据结构:序列 a.任何序列都是从 0 序列号(也成为索引)开始的: 如下:第一个元素是‘H’ >>> a = 'Hello'>>> a[0]'H' b.序列的操作: 分片:a[1:5]  #表示从第2个元素到第6个元素,但不包括第6个元素 a[-3:-1] #表示从倒数第3个元素到倒数第一个元素,但不包括倒数第一个元素 a[-3:]   #表示从倒数第三个元素到最后一个元素,可以取到最后一个元素 a[:]  #表示a的全部元素 a[1:9:2]  #表示从

Python学习-3天--列表与元组

列表是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推.(python叫列表,而其他语言类叫"数组") Python有6个序列的内置类型,但最常见的是列表和元组. 序列都可以进行的操作包括索引,切片,加,乘,检查成员. 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 列表的数据项不需要具有相同的类型 创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可. #!/usr/