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 Web框架Flask信号机制(signals)介绍
Jan 01 Python
Python最长公共子串算法实例
Mar 07 Python
简单介绍使用Python解析并修改XML文档的方法
Oct 15 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
Feb 18 Python
python使用tensorflow深度学习识别验证码
Apr 03 Python
一篇文章读懂Python赋值与拷贝
Apr 19 Python
numpy中loadtxt 的用法详解
Aug 03 Python
浅析Python函数式编程
Oct 06 Python
Django REST framework 分页的实现代码
Jun 19 Python
如何基于Python批量下载音乐
Nov 11 Python
完美解决pycharm导入自己写的py文件爆红问题
Feb 12 Python
解决Jupyter NoteBook输出的图表太小看不清问题
Apr 16 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极大的增强功能和性能
2006/10/09 PHP
php使用curl存储cookie的示例
2014/03/31 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
2016/03/01 PHP
javascript 模式设计之工厂模式学习心得
2010/04/27 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
简单学习JavaScript中的for语句循环结构
2015/11/10 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
jquery validation验证表单插件
2017/01/07 Javascript
JS实现的二叉树算法完整实例
2017/04/06 Javascript
js replace 全局替换的操作方法
2018/06/12 Javascript
ES6 如何改变JS内置行为的代理与反射
2019/02/11 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
2019/02/26 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
2019/08/07 Javascript
小程序富文本提取图片可放大缩小
2020/05/26 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
python3库numpy数组属性的查看方法
2018/04/17 Python
python3+PyQt5实现柱状图
2018/04/24 Python
pandas使用apply多列生成一列数据的实例
2018/11/28 Python
python实现静态服务器
2019/09/05 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
Django表单提交后实现获取相同name的不同value值
2020/05/14 Python
Python ADF 单位根检验 如何查看结果的实现
2020/06/03 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
2020/09/24 Python
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
goodhealth官方海外旗舰店:新西兰国民营养师
2017/12/15 全球购物
拉飞逸官网:Lafayette 148 New York
2020/07/15 全球购物
证婚人经典证婚词
2014/01/09 职场文书
医院工作检讨书范文
2014/02/10 职场文书
幼儿园保育员责任书
2014/07/22 职场文书
优秀党务工作者先进事迹材料
2014/12/25 职场文书
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL
mysql拆分字符串作为查询条件的示例代码
2022/07/07 MySQL