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 相关文章推荐
21行Python代码实现拼写检查器
Jan 25 Python
浅析python打包工具distutils、setuptools
Apr 20 Python
Django实现全文检索的方法(支持中文)
May 14 Python
python中使用iterrows()对dataframe进行遍历的实例
Jun 09 Python
python调用百度REST API实现语音识别
Aug 30 Python
python re正则匹配网页中图片url地址的方法
Dec 20 Python
django框架使用方法详解
Jul 18 Python
python解析yaml文件过程详解
Aug 30 Python
python requests证书问题解决
Sep 05 Python
Pycharm创建项目时如何自动添加头部信息
Nov 14 Python
Python+OpenCV实现将图像转换为二进制格式
Jan 09 Python
Python使用socket模块实现简单tcp通信
Aug 18 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 使用redis锁限制并发访问类示例
2016/11/02 PHP
CI框架实现优化文件上传及多文件上传的方法
2017/01/04 PHP
详解php用static方法的原因
2018/09/12 PHP
jQuery父级以及同级元素查找介绍
2013/09/04 Javascript
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
JavaScript利用构造函数和原型的方式模拟C#类的功能
2014/03/06 Javascript
HTML5+setCutomValidity()函数验证表单实例分享
2015/04/24 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
jQuery实现手机版页面翻页效果的简单实例
2016/10/05 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
JS拉起或下载app的实现代码
2017/02/22 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
2019/07/05 Javascript
vue2路由基本用法实例分析
2020/03/06 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
2014/06/25 Python
python pip源配置,pip配置文件存放位置的方法
2019/07/12 Python
python生成器用法实例详解
2019/11/22 Python
python super用法及原理详解
2020/01/20 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
英语专业个人求职信范文
2014/02/01 职场文书
高校教师自荐信范文
2014/03/13 职场文书
关于青春的演讲稿
2014/05/05 职场文书
社区巾帼文明岗事迹材料
2014/06/03 职场文书
党员先进事迹材料
2014/12/19 职场文书
大学辅导员述职报告
2015/01/10 职场文书
工程款申请报告
2015/05/15 职场文书
升学宴家长致辞
2015/07/27 职场文书
2019最新劳动仲裁申请书!
2019/07/08 职场文书
Mysql数据库事务的脏读幻读及不可重复读详解
2022/05/30 MySQL