深入理解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模块。
深入理解python之二——python列表和元组的更多相关文章
- python数据类型二(列表和元组)
一.列表 1.1 列表的介绍 列表是python的基本数据类型之一,其他编程语言也有类似的数据类型,比如JS中的数组,java中的数组等等,它是以[]括起来,每个元素用逗号隔开,而且可以存放各种数据类 ...
- Python创建二维列表的正确姿势
Python创建二维列表的正确姿势 简介 Python中没有数组,使用list结构代替,并且list结构的功能更加强大: 支持动态扩容,无需担心元素过量 对list内的元素类型不做一致性约束 提供丰富 ...
- python基本数据类型之列表和元组
python基本数据类型之列表与元组 python中list与tuple都是可以遍历类型.不同的是,list是可以修改的,而元组属于不可变类型,不能修改. 列表和元组中的元素可以是任意类型,并且同一个 ...
- python构造二维列表以及排序字典
1. 构造二维列表: 比如我现在需要一个100*100的二维列表: a = [] for i in range(100): a.append([]) for j in range(100): a[i] ...
- python学习(二) 列表和元组
第2章 列表和元组 2.1 序列概论 python有六种内建的序列,本章讨论最常用的两种类型:列表和元组.其他的内建序列有字符串.Unicode字符串.buffer对象和xragne对象. 列表和元 ...
- python保存二维列表到txt文件,读取txt文件里面的数据转化为二维列表
源码: # 读文件里面的数据转化为二维列表 def Read_list(filename): file1 = open(filename+".txt", "r" ...
- .Net程序员之Python基础教程学习----列表和元组 [First Day]
一. 通用序列操作: 其实对于列表,元组 都属于序列化数据,可以通过下表来访问的.下面就来看看序列的基本操作吧. 1.1 索引: 序列中的所有元素的下标是从0开始递增的. 如果索引的长度的是N,那么所 ...
- python学习笔记之列表与元组
一.概述 python包含6种内建的序列,其中列表和元组是最常用的两种类型.列表和元组的主要区别在于,列表可以修改,元组则不能修改 使用上,如果要根据要求来添加元素,应当使用列表:而由于要求序列不可修 ...
- Python学习笔记_week2_列表、元组、字典、字符串、文件、i编码
一. 列表.元组 names=["A","B","C","D"] print(names) print(names[0] ...
- Python【2】-列表和元组
一.序列 python包含六种内建的序列:列表.元组.字符串.unicode字符串.buffer对象.xrange对象. 列表可以修改,元组是不能修改的. 二.列表 列表list是变长序列,其中的内容 ...
随机推荐
- C/C++注册动态对象到Lu系统并进行运算符重载
欢迎访问Lu程序设计 C/C++注册动态对象到Lu系统并进行运算符重载 1 说明 要演示本文的例子,你必须下载Lu32脚本系统.本文的例子需要lu32.dll.lu32.lib.C格式的头文件lu32 ...
- C++ #include—尖括号和双引号的区别
如果你还看一些别的C++教程,那么你可能很早就发现了,有些书上的#include命令写作#include <文件名>,但有时候又会出现#include "文件名".你会 ...
- adb 查看内存信息的命令
meminfo: basic memory status-adb shell cat proc/meminfo -- 内存系统信息-adb shell cat proc/pid/maps -- 指 ...
- POJ 3258 River Hopscotch(二分答案)
River Hopscotch Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21939 Accepted: 9081 Desc ...
- 总结一下最近用到的技术(2)--JsonSchema和JsonSchemaValidator
我们最早接触xml的时候会使用一个dtd文件去定义xml里可以有哪些元素和属性等,后来发展到xml schama(是一个xsd文件,在dtd的基础上提供了命名空间等更强大的功能) 现在,RESTful ...
- 富文本编辑器TinyMCE
最近项目中用到了javascript富文本编辑器,从网上找开源控件,发现很多可选,参考下面文章,列出了很多可用的插件http://www.cnblogs.com/ywqu/archive/2009/1 ...
- The end of the world
这首63年乡村及流行排行榜双料亚军的歌曲,(Cashbox 年终冠军)据说原是作者为怀念亡父写就,虽是流行曲风,但由Skeeter Davis演唱,却赋予其不同的生命,在键盘连绵的三连音中,少女诉说着 ...
- POJ-放苹果(DP)
放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 29074 Accepted: 18376 Description 把M个 ...
- Linux中脚本
编辑脚本要注意开头 和 修改脚本的权限 1. 开头 #!/bin/bash 如查看/etc路径下的文件,可以编辑 2. 修改权限 chmod 775 脚本文件.sh 如创建一个脚本(test.sh ...
- jupyter notebook快捷键速查手册
jupyter notebook快捷键速查手册 Enter : 转入编辑模式 Shift-Enter : 运行本单元,选中下个单元 Ctrl-Enter : 运行本单元 Alt-Enter : 运行本 ...