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操作MongoDB基础知识
Nov 01 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 Python
1 行 Python 代码快速实现 FTP 服务器
Jan 25 Python
scrapy spider的几种爬取方式实例代码
Jan 25 Python
pandas.DataFrame 根据条件新建列并赋值的方法
Apr 08 Python
Python读取VOC中的xml目标框实例
Mar 10 Python
在jupyter notebook 添加 conda 环境的操作详解
Apr 10 Python
matlab 计算灰度图像的一阶矩,二阶矩,三阶矩实例
Apr 22 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
May 12 Python
Python控制台实现交互式环境执行
Jun 09 Python
基于python实现坦克大战游戏
Oct 27 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
Jan 27 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
Linux php 中文乱码的快速解决方法
2016/05/13 PHP
Yii+upload实现AJAX上传图片的方法
2016/07/13 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
2020/07/19 PHP
PHP实现爬虫爬取图片代码实例
2021/03/03 PHP
常用js脚本
2006/12/03 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
2013/09/06 Javascript
构造函数+原型模式构造js自定义对象(最通用)
2014/05/12 Javascript
Jquery解析Json格式数据过程代码
2014/10/17 Javascript
javascript常用代码段搜集
2014/12/04 Javascript
jQuery插件datepicker 日期连续选择
2015/06/12 Javascript
javascript随机显示背景图片的方法
2015/06/18 Javascript
zTree插件下拉树使用入门教程
2016/04/11 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
vue.js实现点击后动态添加class及删除同级class的实现代码
2018/04/04 Javascript
AngularJS 事件发布机制
2018/08/28 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
2019/12/07 Javascript
Python中List.count()方法的使用教程
2015/05/20 Python
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
Python基于sklearn库的分类算法简单应用示例
2018/07/09 Python
python和opencv实现抠图
2018/07/18 Python
python中数组和矩阵乘法及使用总结(推荐)
2019/05/18 Python
python安装scipy的方法步骤
2019/06/26 Python
详解Python self 参数
2019/08/30 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
html5使用canvas实现弹幕功能示例
2017/09/11 HTML / CSS
缓解脚、腿和背部疼痛:Z-CoiL鞋
2019/03/12 全球购物
印度第一网上礼品店:IGP.com
2020/02/06 全球购物
Hurley官方网站:扎根于海滩生活方式的全球青年文化品牌
2020/05/18 全球购物
老人节主持词
2015/07/04 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书
基于python制作简易版学生信息管理系统
2021/04/20 Python
Python手拉手教你爬取贝壳房源数据的实战教程
2021/05/21 Python
mysql 生成连续日期及变量赋值
2022/03/20 MySQL
深入理解 Golang 的字符串
2022/05/04 Golang