Python列表与元组的异同详解


Posted in Python onJuly 02, 2019

前言

“列表(list)与元组(tuple)两种数据类型有哪些区别”这个问题在初级程序员面试中经常碰到,超出面试官预期的答案往往能加不少印象分,也会给后续面试顺利进行提供一定帮助,这道题主要考察候选人对Python基本数据结构的掌握程度,属于简单类型的送分题,那么该如何来回答才不至于丢分?

相同点:都是序列类型

回答它们的区别之前,先来说说两者有什么相同之处。list 与 tuple 都是序列类型的容器对象,可以存放任何类型的数据、支持切片、迭代等操作

>>> foos = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> foos[0:10:2]
[0, 2, 4, 6, 8]
>>> bars = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> bars[1:10:2]
(1, 3, 5, 7, 9)

两者的操作如此相似,Python 为什么还要设计出 tuple 这种类型出来呢?这就要从它们的不同之处来寻找答案。

不同点一:不可变 VS 可变

两种类型除了字面上的区别(括号与方括号)之外,最重要的一点是tuple是不可变类型,大小固定,而 list 是可变类型、数据可以动态变化,这种差异使得两者提供的方法、应用场景、性能上都有很大的区别。

列表特有方法:

>>> foo = [2,3,1,9,4]
>>> foo.sort() # 排序
>>> foo.insert(5,10) # 插入
>>> foo.reverse() # 反转
>>> foo.extend([-1, -2]) # 扩展
>>> foo.remove(10) # 移除
>>> foo.pop() # 弹出最后一个元素
>>> foo.append(5) # 追加

所有的操作都基于原来列表进行更新,而 tuple 作为一种不可变的数据类型,同样大小的数据,初始化和迭代 tuple 都要快于 list

>python -m timeit "[1,2,3,4,5]"
10000000 loops, best of 3: 0.123 usec per loop
>python -m timeit "(1,2,3,4,5)"
100000000 loops, best of 3: 0.0166 usec per loop

同样大小的数据,tuple 占用的内存空间更少

>>> foo = tuple(range(1000))
>>> bar = list(range(1000))
>>> foo.__sizeof__()
8024
>>> bar.__sizeof__()
9088

原子性的 tuple 对象还可作为字典的键

>>> foo = (1,(2,3))
>>> d = {foo: 1}
>>> bar = (1, [2,3]) # 非原子性tuple,因为元组中包含有不可哈希的list
>>> d = {bar: 1}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

不同点二:同构 VS 异构

tuple 用于存储异构(heterogeneous)数据,当做没有字段名的记录来用,比如用 tuple 来记录一个人的身高、体重、年龄。

person = ("zhangsan", 20, 180, 80)

比如记录坐标上的某个点

point = (x, y)

而列表一般用于存储同构数据(homogenous),同构数据就是具有相同意义的数据,比如下面的都是字符串类型

["zhangsan", "Lisi", "wangwu"]

再比如 list 存放的多条用户记录

[("zhangsan", 20, 180, 80), ("wangwu", 20, 180, 80)]

因为 tuple 作为没有名字的记录来使用在某些场景有一定的局限性,所以又有了一个 namedtuple 类型的存在,namedtuple 可以指定字段名,用来当做一种轻量级的类来使用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中处理unchecked未捕获异常实例
Jan 17 Python
Python OS模块常用函数说明
May 23 Python
Python抓取百度查询结果的方法
Jul 08 Python
Python保存MongoDB上的文件到本地的方法
Mar 16 Python
5个很好的Python面试题问题答案及分析
Jan 19 Python
python 脚本生成随机 字母 + 数字密码功能
May 26 Python
python基于FTP实现文件传输相关功能代码实例
Sep 28 Python
Python模块的定义,模块的导入,__name__用法实例分析
Jan 07 Python
python 元组的使用方法
Jun 09 Python
python 字符串格式化的示例
Sep 21 Python
Opencv python 图片生成视频的方法示例
Nov 18 Python
Selenium浏览器自动化如何上传文件
Apr 06 Python
Pandas中resample方法详解
Jul 02 #Python
Python何时应该使用Lambda函数
Jul 02 #Python
Python Pandas分组聚合的实现方法
Jul 02 #Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 #Python
python flask框架实现重定向功能示例
Jul 02 #Python
python实现串口自动触发工作的示例
Jul 02 #Python
python常用函数与用法示例
Jul 02 #Python
You might like
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
2015/12/09 PHP
PHP中常见的密码处理方式和建议总结
2018/10/14 PHP
ThinkPHP5&amp;5.1框架关联模型分页操作示例
2019/08/03 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
你可能不再需要JQUERY
2021/03/09 Javascript
javascript 混合的构造函数和原型方式,动态原型方式
2009/12/07 Javascript
javascript中的undefined 与 null 的区别  补充篇
2010/03/17 Javascript
js计算文本框输入的字符数
2015/10/23 Javascript
基于JavaScript实现 网页切出 网站title变化代码
2016/04/03 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
Bootstrap警告(Alerts)的实现方法
2017/03/22 Javascript
对vue中methods互相调用的方法详解
2018/08/30 Javascript
Nodejs实现多文件夹文件同步
2018/10/17 NodeJs
利用JavaScript的Map提升性能的方法详解
2019/08/14 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
JavaScript Canvas编写炫彩的网页时钟
2019/10/16 Javascript
js实现弹窗效果
2020/08/09 Javascript
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
vue项目中使用rem,在入口文件添加内容操作
2020/11/11 Javascript
Python3操作MongoDB增册改查等方法详解
2020/02/10 Python
Scrapy 配置动态代理IP的实现
2020/09/28 Python
用CSS3实现背景渐变的方法
2015/07/14 HTML / CSS
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
PatPat香港:婴童服饰和亲子全家装在线购物
2020/09/27 全球购物
材料物理专业个人求职信
2013/12/15 职场文书
外国人聘用意向书
2014/04/01 职场文书
中层领导干部群众路线对照检查材料思想汇报
2014/10/02 职场文书
三八妇女节寄语
2015/02/27 职场文书
2015年综治维稳工作总结
2015/04/07 职场文书
少先队工作总结2015
2015/05/13 职场文书
赞美教师的句子
2019/09/02 职场文书
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python
浅谈PostgreSQL表分区的三种方式
2021/06/29 PostgreSQL
JavaScript流程控制(循环)
2021/12/06 Javascript
Redis实现短信验证码登录的示例代码
2022/06/14 Redis