从一开始学习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模块。

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

  1. python数据类型二(列表和元组)

    一.列表 1.1 列表的介绍 列表是python的基本数据类型之一,其他编程语言也有类似的数据类型,比如JS中的数组,java中的数组等等,它是以[]括起来,每个元素用逗号隔开,而且可以存放各种数据类 ...

  2. Python创建二维列表的正确姿势

    Python创建二维列表的正确姿势 简介 Python中没有数组,使用list结构代替,并且list结构的功能更加强大: 支持动态扩容,无需担心元素过量 对list内的元素类型不做一致性约束 提供丰富 ...

  3. python基本数据类型之列表和元组

    python基本数据类型之列表与元组 python中list与tuple都是可以遍历类型.不同的是,list是可以修改的,而元组属于不可变类型,不能修改. 列表和元组中的元素可以是任意类型,并且同一个 ...

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

    1. 构造二维列表: 比如我现在需要一个100*100的二维列表: a = [] for i in range(100): a.append([]) for j in range(100): a[i] ...

  5. python学习(二) 列表和元组

    第2章  列表和元组 2.1 序列概论 python有六种内建的序列,本章讨论最常用的两种类型:列表和元组.其他的内建序列有字符串.Unicode字符串.buffer对象和xragne对象. 列表和元 ...

  6. python保存二维列表到txt文件,读取txt文件里面的数据转化为二维列表

    源码: # 读文件里面的数据转化为二维列表 def Read_list(filename): file1 = open(filename+".txt", "r" ...

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

    一. 通用序列操作: 其实对于列表,元组 都属于序列化数据,可以通过下表来访问的.下面就来看看序列的基本操作吧. 1.1 索引: 序列中的所有元素的下标是从0开始递增的. 如果索引的长度的是N,那么所 ...

  8. python学习笔记之列表与元组

    一.概述 python包含6种内建的序列,其中列表和元组是最常用的两种类型.列表和元组的主要区别在于,列表可以修改,元组则不能修改 使用上,如果要根据要求来添加元素,应当使用列表:而由于要求序列不可修 ...

  9. Python学习笔记_week2_列表、元组、字典、字符串、文件、i编码

    一. 列表.元组 names=["A","B","C","D"] print(names) print(names[0] ...

  10. Python【2】-列表和元组

    一.序列 python包含六种内建的序列:列表.元组.字符串.unicode字符串.buffer对象.xrange对象. 列表可以修改,元组是不能修改的. 二.列表 列表list是变长序列,其中的内容 ...

随机推荐

  1. 【cs229-Lecture7】支持向量机(SVM)

    SVM不错的学习资料: 百度网盘链接: http://pan.baidu.com/s/1hqw0Rnm 密码: asec blog:http://www.blogjava.net/zhenandaci ...

  2. 如何使用Gradle的maven-publish将jar包或者war包上传到nexus仓库

    首先,在build.gradle里边声明依赖maven-publish插件: apply plugin: 'maven-publish' 然后,配置项目的信息和和nexus的信息: publishin ...

  3. stopImmediatePropagation和stopPropagation (事件、防止侦听)

    参考: ActionScript 3.0 Step By Step系列(六):学对象事件模型,从点击按扭开始 actionscript宝典 一.事件模型 egret中的事件模型和flash是一样的,但 ...

  4. 【咸鱼教程】Egret可长按识别二维码(精确位置和大小)

    教程目录一 实现原理二 实现过程三 Demo下载 本教程是在Egret中实现长按识别的二维码,并可以精确定位二维码的位置和大小,支持横屏和竖屏. 一 实现原理 微信中长按识别二维码,需要长按jpg或p ...

  5. wps插件开发中com组件权限

    需要对wps写一个小的插件,也就是几行代码的事情,但却碰到了一个坑 wps中的com组件的调用和MSoffice非常的相似,几乎只需要把包的头修改一下就可以用了. 比如开发wps文档的插件,需要引用 ...

  6. AndroidStudio 使用Release签名进行Debug

    extends:http://blog.csdn.net/h3c4lenovo/article/details/42011887 , http://www.linuxidc.com/Linux/201 ...

  7. Mac - MySQL初始密码忘记重置MySQL root密码

    在什么情况下,需要重置root密码呢?那就是我们忘记了.还有一种比较坑的,那就是笔者的这种情况.按照正常的情况下,MySQL安装完之后,会弹出一个对话框,显示着一个临时的root密码,但无论笔者如何重 ...

  8. 思科SVI接口和路由接口区别

    Cisco多层交换中提到了一个SVI接口,路由接口.在多层交换机上可以将端口配置成不同类型的接口. 其中SVI接口 类似于  interface Vlan10ip address 192.168.20 ...

  9. MatLab Mark Points 给点标序号

    在MatLab中,我们有时要给画出的点按一定顺序标上序号,下面这个简单的例子实现这个功能: x=rand(,); y=rand(,); plot(x,y,'r*'); text(x+:));

  10. centos6.9环境下JDK安装部署

    1.准备jdk安装文件: 这里我使用的是 jdk-7u79-linux-x64.tar.gz 2.在 /usr/local 目录下创建 sotfware目录,并上传JDK文件: 解压文件并修改文件夹为 ...