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 相关文章推荐
Django实现图片文字同时提交的方法
May 26 Python
Python3生成手写体数字方法
Jan 30 Python
python 3.7.0 安装配置方法图文教程
Aug 27 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
Nov 29 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
Jan 17 Python
pytorch 模型可视化的例子
Aug 17 Python
简单了解Django ORM常用字段类型及参数配置
Jan 07 Python
flask利用flask-wtf验证上传的文件的方法
Jan 17 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
Apr 14 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
Jun 28 Python
Python2及Python3如何实现兼容切换
Sep 01 Python
python编程的核心知识点总结
Feb 08 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
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
php中socket通信机制实例详解
2015/01/03 PHP
通过js脚本复制网页上的一个表格的不错实现方法
2006/12/29 Javascript
javascript一点特殊用法
2008/05/28 Javascript
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
基于jquery的划词搜索实现(备忘)
2010/09/14 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
jQuery Validate表单验证入门学习
2015/12/18 Javascript
原生javascript实现的ajax异步封装功能示例
2016/11/03 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
vue 解决数组赋值无法渲染在页面的问题
2019/10/28 Javascript
JavaScript实现答题评分功能页面
2020/06/24 Javascript
关于vue 结合原生js 解决echarts resize问题
2020/07/26 Javascript
[01:02:09]Liquid vs TNC 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21
2020/07/19 DOTA
[42:23]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第二场 12.10
2020/12/13 DOTA
python静态方法实例
2015/01/14 Python
详解python调度框架APScheduler使用
2017/03/28 Python
python中文件变化监控示例(watchdog)
2017/10/16 Python
python模块smtplib学习
2018/05/22 Python
python是否适合网页编程详解
2019/10/04 Python
拿来就用!Python批量合并PDF的示例代码
2020/08/10 Python
python如何使用腾讯云发送短信
2020/09/17 Python
解决pytorch下出现multi-target not supported at的一种可能原因
2021/02/06 Python
选购世界上最好的美妆品:Cult Beauty
2017/11/03 全球购物
德国玩具商店:Planet Happy DE
2021/01/16 全球购物
浙江文明网签名寄语
2014/01/18 职场文书
法制宣传实施方案
2014/03/13 职场文书
2014年关于两会精神的心得体会
2014/03/17 职场文书
感恩寄语大全
2014/04/11 职场文书
小学六年级学生评语
2014/04/22 职场文书
房地产销售员岗位职责
2015/04/11 职场文书
运动会广播稿300字
2015/08/19 职场文书
pytorch实现ResNet结构的实例代码
2021/05/17 Python