对于Python来说,列表可谓是用到的非常多的数据结构之一了,但是Python还有另外一个数据结构叫做元组,直观表现来说,元组就像是不可变的列表,那么问题来了,元组和列表的区别是什么呢?什么时候应该用元组,什么时候应该用列表呢?我在刚开始学习Python的过程当中一直有这种困惑,本文是我总结的一些关于Python列表和元组的相关知识,下面来一起看一下吧。

基础知识

总的来说,列表和元组实际上都是「一个可以放置任意数据类型的有序数组」, 相比于其他语言,比如说C或者Java等等,他们数组中的元素类型必须保持一致,而Python当中并不存在这个限制,可以在里面放任意的元素。

从表现形式上看来,数组用的是中括号()而元组用的是小括号(),他们的区别如下:

「列表是可变的(mutable)」, 长度大小不固定,可以任意的增删改元素

「元组是不可变的(immutable)」, 长度大小固定, 无法对元素删减或者改变

我们通过一个具体的样例来看一下上面的区别,对于列表,我们很容易的利用索引修改当中的元素,而对于元组来说,如果对它进行修改操作,则会触发错误,原因就是元组是不可变的。

我们利用colab来演示结果:

那么问题来了,元组一旦被创建就无法对它进行做任何的改变, 那么如果我们想改变元组当中的值,又该如何操作呢?那只能重新开辟一块内存,创建新的元组了, 同样我们来看下面的一个例子:

可以发现,对于列表进行增加元素的操作,列表本身的内存地址并没有发生改变,而对于元组来说,它本身的内存地址发生了改变,也就符合上面所说的,如果想要对元组中的元素进行新增操作,则会重新开辟一块内存。

基本操作

下面来简单介绍一下列表和元组中的一些常用的基本操作。

索引

对于Python的列表和元组来说,有一个非常强大的功能就是「支持负数索引」,其中表示最后一个元素, 表示倒数第二个元素,以此类推。

切片

除了索引,Python当中的元组和列表还支持「切片操作」,对于这个我不打算在这里面详细去说,仅介绍简单的基础用法,如有需求,请参考官方文档。

相互转换

对于列表和元组,可以使用和来进行相互的转换。

内置函数

下面,我们来看一下列表和元组中的内置函数,这里我只介绍一些比较常用的,对于其他的可以参考官方文档。

表示统计列表/元组中元素出现的个数

返回列表/元组元素第一次出现的索引

&

这两个函数分别对列表的元素进行正序排列和逆序排列(元组是没有这两个函数的, 原因是他会改变列表本身)

&

这两个函数是对于列表和元组进行排序的函数,返回的是迭代器, 而返回的是列表。

下面我们来看一下具体的样例:

列表和元组的存储方式

由于列表和元组的特性,列表是可变的,而元组是不可变的,这种差异必然是由于底层的存储方式不同而决定的,首先我们来看下面的样例。

我们可以看到,元组相对于列表来说,在放置相同元素的情况下,元组所占用的空间比列表少了16个字节,主要原因是由于列表是动态的,因此对于列表的存储需要指针,用来指向对应的元素,这里我们存放的是类型,占用了8个字节,其次由于列表的可变性,需要额外的存储来保存已经分配的长度大小的信息(8个字节),这样才能在空闲长度不足的情况下及时的分配内存开辟空间,我们来看下面的一个例子:

我们可以发现,Python为了减少每次列表扩容导致的开销,每次会多分配一定的内存,这样的机制保证了其操作的高效性。而对于元组来说,它本身是不可变的,因此存储空间固定。

列表和元组的性能分析

通过上文对于存储差异的分析,我们可以认为,元组要比列表要更加的轻量一些,因此,总的来说,元组的性能要稍好于列表。

我们来看下面一个列子

这段代码是在我的电脑上运行的,不同的电脑可能会有差异,但是我们可以看出,对于元组的初始化操作要比列表快5倍左右,原因主要是因为Python会对于一些静态数据做「资源缓存」, 对于元组来说,当它占用的空间不大的时候,Python会暂时缓存这一部分内存,当下次请求同样大小的元组的时候,Python无需向系统再次申请这一部分内存,从而提高了程序的运行效率。

当然,如果对于增删操作来说,列表是优于元组的,原因显而易见,元组是需要重新开辟内存,而列表缺不需要这样。

列表和元组的使用场景

上面分析了这么多,那么什么时候应该用元组,什么时候应该用列表呢?这里当然需要具体情况具体分析。

如果存储的数据和数量不变,比如保存图片中所有像素点的rgb值,这个显然是利用元组比较合适一些

如果数据的数量可变,比如需要统计或者计算出来的结果保存,那么显然是利用列表更加合适一些

总结

对于Python当中的元组和列表,从表现形式来看,仅仅只有列表是可变的,而元组是不可变的,但是这个表面特性是由于内部实现而决定的,因此也就造成了对于某些操作的性能差异,因此在选择数据结构的过程中,应该去考虑这一点,选择更加合适的数据结构,总的来说,列表和元组的区别可以总结为如下两点:

列表是可变的,可以任意增加或者删除元素,因此存储空间要略大于元组

元组是不可变的,无法对元素进行增加或者删除,更加轻量,适合保存不变的数据

文章最后,来看一个例子,下面的程序运行结果是怎么样的呢?

t变成

因为tuple不支持对他的元素赋值,因此会触发TypeError异常

两个都是错的

两个都是对的

参考资料

Fluent Python By Luciano Ramalho

Python 官方文档

Lists vs Tuples in Python

Optimization tricks in Python: lists and tuples | Artem Golubin

python元组和列表逆序_Python元组和列表你真的用对了吗?相关推荐

  1. python元组和列表逆序_Python容器:列表与元组

    欢迎关注「issnail」 "一起学习,一起成长!" 与字符串不同的是,元组和列表并不要求所有元素的种类相同,每个元素都可以是任何python类型的对象.列表可变,赋值后可插入或删 ...

  2. python中sorted函数逆序_Python中sorted函数的用法(转)

    [Python] sorted函数 我们需要对List.Dict进行排序,Python提供了两个方法 对给定的List L进行排序, 方法1.用List的成员函数sort进行排序,在本地进行排序,不返 ...

  3. python如何输出整数逆序_python字符串类型及操作

    字符串索引&切片用法 Str[]对字符串进行索引,括号内为获取第几个元素 使用[M:N:K]根据步长对字符串切片 <字符串>[M:N]是可以缺失的,M缺失表示至开头,N缺失表示至结 ...

  4. python实现数的逆序_python怎么逆序

    python中字符串数组如何逆序排列?下面给大家介绍几种方法: 1.数组倒序: 原始元素的倒序排列 (1)切片>>> arr = [1,2,3,4,3,4] >>> ...

  5. python怎么将字符串逆序_python中如何把一个字符串顺序逆序反转的几种方法?

    如 a='123456789' 反转成 a='987654321' 第一种方法:使用字符串切片 >>> a='123456789' >>> a = a[::-1] ...

  6. python列表逆序输出_Python 让列表逆序排列的 3 种方式

    让列表逆序排列是我们编程时常碰到的问题,比如现在有一些客户的姓名是将拼音的首字母按 A - Z 排列的,而你现在想找一个姓张( Z )的客户,你就有了将姓名逆序排列的需求了.而在 Python 中,将 ...

  7. python第k序元素查找列表_【Python】第8次练习:列表——程序填空题 -合并队列、列表元素零的移动、列表逆序输出、第K序元素查找...

    [Python]第8次练习:列表--程序填空题 -合并队列.列表元素"零"的移动.列表逆序输出.第K序元素查找 1.程序填空题 -合并队列 题目:某班男女两队同学各若干人,男生已按 ...

  8. python 逆序_python中逆序

    python中的list的sort方法怎样逆序输出 很简单啊, sort 支持 reverse 参数,看下面的例子,分别按照正常顺序 (升序)排列,以及按照逆序排列. >>> l = ...

  9. python列表逆序

    例如一个列表a = [1,2,3,4,5],列表逆序大致有四种方法: 1. reversed迭代方法: a = list(reversed(a)) 2. 列表自身倒序方法: a.reverse() 3 ...

最新文章

  1. canvas 文字颜色_Canvas技术概述
  2. 阿里面试这样问:redis 为什么把简单的字符串设计成 SDS?
  3. 电脑USB的超奇怪问题
  4. Leetcode 8. 字符串转换整数 (atoi) (每日一题 20210615)
  5. gcc-linux6.3,[环境配置]Ubuntu16.04下编译安装gcc6.3.0
  6. REALTEK 2.5G PCIE网卡 RTL8125BG-CG支持PXE免驱简介
  7. android做题imageview缩放,巧用ViewPager实现驾考宝典做题翻页效果
  8. PowerShell校验哈希
  9. cacti 安装部署
  10. UC,浏览器,不愧是全球使用量最大的第三方手机浏览器!
  11. 阻止冒泡事件(兼容大部分浏览器)
  12. mc服务器fabric安装位置,也许这是史上最详细的Fabric安装教程,助你在1.14/1.15安装mod...
  13. reverse 函数讲解
  14. mysql逻辑结构博客_mysql梳理2
  15. 网络存储技术:DAS存储、NAS存储和SAN存储
  16. Web前端入门(十八)圆角边框及盒子阴影
  17. HTML5+CSS大作业——明星相片个人网页设计(6页)学生网站模板
  18. 斩波电路及斩波运放--降低失调及低频噪声
  19. jor(1):简表(JOR)开源的报表工具调研
  20. Android 开源项目列表

热门文章

  1. 第8期:云原生—— 大学生职场小白该如何学
  2. 彻底理解位运算——左移、右移
  3. 【蓝桥杯真题】本金利息
  4. U3D游戏制作之洋葱设计法
  5. 《惢客创业日记》2022.04.01-30(周五)三月份的总结和四月份的计划
  6. Python精灵模块月江西楼mv
  7. zzuli OJ 1101-1110
  8. mysql datepart_表达式中datepart函数用法及其与sqlserver depart函数、Mysql week函数的差异...
  9. Qt Creator快速入门(第3版)
  10. 高考志愿,你们想好怎么填了吗?