从一开始学习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. django进阶-modelform&admin action

    先看效果图: 登陆admin后的界面: 查看作者: 当然你也可以定制admin, 使界面更牛逼 数据库表结构: app01/models.py from django.db import models ...

  2. 【分布式系列之ActiveMq】ActiveMq入门示例

    前言 github地址:https://github.com/AndyFlower/web-back/tree/master/ActiveMq01 下载ActiveMQ :http://activem ...

  3. Linux(Ubuntu)下也能用搜狗输入法了!!!

    Ubuntu原生的中文输入法是不是总有点别扭? 不用再别扭了. 告诉你一个好消息:Linux(Ubuntu)下也能用搜狗输入法了!!! 下载地址:http://pinyin.sogou.com/lin ...

  4. Linux 下如何安装 .rpm 文件

    执行以下命令安装: rpm -i your-file-name.rpm 详细的可参考: http://os.51cto.com/art/201001/177866.htm

  5. sencha touch NavigationView 源码详解(注释)

    Ext.define('Ext.navigation.View', { extend: 'Ext.Container', alternateClassName: 'Ext.NavigationView ...

  6. [原]git的使用(五)---删除文件

    9.删除文件 [实践出真知] 创建test.txt 文件  并add 和commit到仓库 $ git status #新增加的文件test.txt On branch master Untracke ...

  7. ldap 配置过程详解

    ldap常用名称解释 1.环境搭建 操作系统:centos6.5 x86_64关闭防火墙.selinux开启时间同步# crontab -e加入# time sync*/5 * * * * /usr/ ...

  8. linux指定某非root用户执行开机启动项的方法(gogs git)

    以linux指定git用户在linux开机时执行启动gogs git为例: 以root登录linux 执行vi /etc/rc.d/rc.local 在文档末尾添加一行语句:su git -c &qu ...

  9. 简易扩展Visual Studio UnitTesting支持TestMethodCase

    NUnit的TestCaseAttribute可以简化大量的测试参数输入用例的编写,如果基于Visual Studio Unit Test Project开发则默认没有类似的功能,看一段对比代码: p ...

  10. [转] 基于TINY4412的Andorid开发-------简单的LED灯控制

    阅读目录 一.编写驱动程序 二.编写代码测试驱动程序 三.编写HAL代码 四.编写Framework代码 五.编写JNI代码 六.编写App 参考资料: <Andriod系统源代码情景分析> ...