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中numpy包使用教程之数组和相关操作详解
Jul 30 Python
flask使用session保存登录状态及拦截未登录请求代码
Jan 19 Python
python3 破解 geetest(极验)的滑块验证码功能
Feb 24 Python
Django基于ORM操作数据库的方法详解
Mar 27 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
Jul 02 Python
windows下pycharm安装、创建文件、配置默认模板
Jul 31 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
Python爬虫设置代理IP(图文)
Dec 23 Python
Python3 使用cookiejar管理cookie的方法
Dec 28 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
May 18 Python
解决keras backend 越跑越慢问题
Jun 18 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
Dec 29 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
第二节--PHP5 的对象模型
2006/11/16 PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
2015/10/10 PHP
setTimeout和setInterval的浏览器兼容性分析
2007/02/27 Javascript
基于jquery的商品展示放大镜
2010/08/07 Javascript
javascript getElementsByTagName
2011/01/31 Javascript
使用JS 清空File控件的路径值
2013/07/08 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
jQuery获取(选中)单选,复选框,下拉框中的值
2014/02/21 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
基于vue-upload-component封装一个图片上传组件的示例
2018/10/16 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
JavaScript Date对象功能与用法学习记录
2020/04/28 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
在Python中操作文件之truncate()方法的使用教程
2015/05/25 Python
Python实现批量检测HTTP服务的状态
2016/10/27 Python
使用python在本地电脑上快速处理数据
2017/06/22 Python
对pandas的层次索引与取值的新方法详解
2018/11/06 Python
python 运用Django 开发后台接口的实例
2018/12/11 Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
2019/06/27 Python
python单例设计模式实现解析
2020/01/07 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
2020/03/12 Python
python输出数学符号实例
2020/05/11 Python
python爬虫使用scrapy注意事项
2020/11/23 Python
AVON雅芳官网:世界上最大的美容化妆品公司之一
2016/11/02 全球购物
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
如何在Shell脚本中使用函数
2015/09/06 面试题
实习教师自我鉴定
2013/12/09 职场文书
机关工会开展学习雷锋活动总结
2014/03/01 职场文书
淘宝店策划方案
2014/06/07 职场文书
《中国梦我的梦》中学生演讲稿
2014/08/20 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
群众路线个人对照检查材料
2014/09/23 职场文书
体育个人工作总结
2015/02/09 职场文书
pytorch 实现多个Dataloader同时训练
2021/05/29 Python
hive数据仓库新增字段方法
2022/06/25 数据库