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 logging类库使用例子
Nov 22 Python
Python的re模块正则表达式操作
May 25 Python
深入学习Python中的装饰器使用
Jun 20 Python
python开发利器之ulipad的使用实践
Mar 16 Python
浅谈python socket函数中,send与sendall的区别与使用方法
May 09 Python
解决python3读取Python2存储的pickle文件问题
Oct 25 Python
详解Python中的各种转义符\n\r\t
Jul 10 Python
python join方法使用详解
Jul 30 Python
python+adb+monkey实现Rom稳定性测试详解
Apr 23 Python
Python读取多列数据以及用matplotlib制作图表方法实例
Sep 23 Python
Pytest测试框架基本使用方法详解
Nov 25 Python
解决python存数据库速度太慢的问题
Apr 23 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控制linux服务器常用功能 关机 重启 开新站点等
2012/09/05 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
2017/04/15 PHP
php出租房数据管理及搜索页面
2017/05/23 PHP
syntaxhighlighter 使用方法
2007/07/02 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
有关于JS辅助函数inherit()的问题
2013/04/07 Javascript
浅析XMLHttpRequest的缓存问题
2013/12/13 Javascript
jquery实现右键菜单插件
2015/03/29 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
2016/03/02 Javascript
javascript单页面手势滑屏切换原理详解
2016/03/21 Javascript
bootstrap模态框垂直居中效果
2016/12/03 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
浅谈VUE监听窗口变化事件的问题
2018/02/24 Javascript
AjaxUpLoad.js实现文件上传
2018/03/05 Javascript
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
微信小程序实现吸顶特效
2020/01/08 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
python fabric实现远程操作和部署示例
2014/03/25 Python
详解Python中内置的NotImplemented类型的用法
2015/03/31 Python
Python中函数的参数传递与可变长参数介绍
2015/06/30 Python
python daemon守护进程实现
2016/08/27 Python
python3+PyQt5实现柱状图
2018/04/24 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
学习python分支结构
2019/05/17 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
2020/06/06 Python
Space NK英国站:英国热门美妆网站
2017/12/11 全球购物
30年同学聚会感言
2014/01/30 职场文书
公务员平时考核实施方案
2014/03/11 职场文书
田径运动会通讯稿
2014/09/13 职场文书
银行授权委托书范本
2014/10/04 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书
使用HTML+Css+transform实现3D导航栏的示例代码
2021/03/31 HTML / CSS
vue如何实现关闭对话框后刷新列表
2022/04/08 Vue.js
windows系统搭建WEB服务器详细教程
2022/08/05 Servers