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之开始真正编程
Sep 12 Python
python 实现A*算法的示例代码
Aug 13 Python
Django 登陆验证码和中间件的实现
Aug 17 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
Mar 11 Python
Python学习笔记之Break和Continue用法分析
Aug 14 Python
关于Python形参打包与解包小技巧分享
Aug 24 Python
Python 线程池用法简单示例
Oct 02 Python
python 遗传算法求函数极值的实现代码
Feb 11 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
Mar 23 Python
Python如何操作office实现自动化及win32com.client的运用
Apr 01 Python
Python爬取微信小程序Charles实现过程图解
Sep 29 Python
用Python提取PDF表格的方法
Apr 11 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+DBM的同学录程序(2)
2006/10/09 PHP
PHP去除数组中重复的元素并按键名排序函数
2008/08/18 PHP
php获取百度收录、百度热词及百度快照的方法
2015/04/02 PHP
php实现QQ小程序发送模板消息功能
2019/09/18 PHP
按给定几率进行随机抽取的js代码
2010/12/28 Javascript
javascript动画浅析
2012/08/30 Javascript
有关于eclipse配置spket需要注意的一些地方
2013/04/07 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
基于jQuery实现美观且实用的倒计时实例代码
2015/12/30 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
2017/06/16 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
给vue项目添加ESLint的详细步骤
2017/09/29 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
jquery实现购物车基本功能
2019/10/25 jQuery
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
如何通过JS实现日历简单算法
2020/10/14 Javascript
Python translator使用实例
2008/09/06 Python
介绍Python中的一些高级编程技巧
2015/04/02 Python
Python实现字典依据value排序
2016/02/24 Python
python 全局变量的import机制介绍
2017/09/07 Python
django settings.py 配置文件及介绍
2019/07/15 Python
利用Pytorch实现简单的线性回归算法
2020/01/15 Python
一文读懂Python 枚举
2020/08/25 Python
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
YSL圣罗兰美妆美国官网:Yves Saint Lauret US
2016/11/21 全球购物
中专生自荐信
2013/10/12 职场文书
机械设计及其自动化专业推荐信
2013/10/31 职场文书
会计电算化应届生自荐信
2014/02/25 职场文书
教学质量评估实施方案
2014/03/17 职场文书
中学清明节活动总结
2014/07/04 职场文书
低碳日宣传活动总结
2014/07/09 职场文书
湖南省党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
红楼梦读书笔记
2015/06/25 职场文书
宾馆卫生管理制度
2015/08/06 职场文书
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL