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发送邮件实例讲解(python发邮件附件可以使用email模块实现)
Dec 03 Python
python转换摩斯密码示例
Feb 16 Python
python过滤字符串中不属于指定集合中字符的类实例
Jun 30 Python
PYTHON基础-时间日期处理小结
May 05 Python
浅谈python编译pyc工程--导包问题解决
Mar 20 Python
python算法与数据结构之单链表的实现代码
Jun 27 Python
pycharm配置git(图文教程)
Aug 16 Python
python飞机大战 pygame游戏创建快速入门详解
Dec 17 Python
Python字典添加,删除,查询等相关操作方法详解
Feb 07 Python
Python定时器线程池原理详解
Feb 26 Python
tensorflow安装成功import tensorflow 出现问题
Apr 16 Python
python实现简单区块链结构
Apr 25 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 和 HTML
2006/10/09 PHP
一个用于mysql的数据库抽象层函数库
2006/10/09 PHP
PHP4和PHP5性能测试和对比 测试代码与环境
2007/08/17 PHP
PHP 进程锁定问题分析研究
2009/11/24 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
PHP通过GD库实现验证码功能示例
2019/02/23 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
jquery 表单进行客户端验证demo
2009/08/24 Javascript
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
JavaScript arguments 多参传值函数
2010/10/24 Javascript
关于extjs4如何获取grid修改后的数据的问题
2013/08/07 Javascript
JavaScript实现身份证验证代码
2016/02/17 Javascript
详解js中call与apply关键字的作用
2016/11/21 Javascript
微信小程序开发的四十个技术窍门总结(推荐)
2017/01/23 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
解决Layui数据表格显示无数据提示的问题
2019/11/14 Javascript
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
使用Python简单的实现树莓派的WEB控制
2016/02/18 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
2017/04/28 Python
机器学习的框架偏向于Python的13个原因
2017/12/07 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
2018/05/04 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
python实现按首字母分类查找功能
2019/10/31 Python
Python sep参数使用方法详解
2020/02/12 Python
python创建文本文件的简单方法
2020/08/30 Python
CSS3实现全景图特效示例代码
2018/03/26 HTML / CSS
德国旅行、体验和活动的预订平台:Watado
2019/12/04 全球购物
屈臣氏俄罗斯在线商店:Watsons俄罗斯
2020/08/03 全球购物
自动化系在校本科生求职信
2013/10/23 职场文书
幼儿园庆六一游园活动方案
2014/01/29 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
茶花女读书笔记
2015/06/29 职场文书
Python的flask接收前台的ajax的post数据和get数据的方法
2021/04/12 Python