文章目录

  • Python列表和元组的详细区别
    • 一、列表和元组的区别
    • 二、列表(List)
    • 三、元组(Tuple)

Python列表和元组的详细区别

一、列表和元组的区别

  1. 列表是动态数组,它们可变且可以重设长度(改变其内部元素的个数)。
  2. 元组是静态数组,它们不可变,且其内部数据一旦创建便无法改变。
  3. 元组缓存于Python运行时环境,这意味着我们每次使用元组时无须访问内核去分配内存。

这些区别结实率两者在设计哲学上的不同:

  • 列表可被用于保存多个互相独立对象的数据集合
  • 元组用于描述一个不会改变的事务的多个属性

二、列表(List)

列表一旦创建了我们就可以根据自己的需要随意改变它的内容:

>>> l = [1, 2, 3, 4, 5, 6]
>>> l[0] = l[2] * l[3]
>>> l
[12, 2, 3, 4, 5, 6]

另外我们可以给列边添加新的数据来增加其大小:

>>> len(l)
6
>>> l.append(7)
>>> l
[12, 2, 3, 4, 5, 6, 7]
>>> len(l)
7

这是因为动态数组支持resize操作,可以增加数组的容量。当一个大小为N的列表第一次需要添加数据时,Python会创建一个新的列表,足够放原来的N个元素以及额外添加的元素。不过,实际分配的并不是N+1个元素,而是M个元素,M > N, 这是为了给未来的添加预留空间。然后旧列表的数据被复制到新列表中,旧列表则会被销毁。从设计理念上来说,第一次添加可能是后续多次添加的开始,通过预留空间的做法,我们就可以减少这一分配空间的操作次数以及内存复制的次数。这点非常重要,因为内存复制可能非常的昂贵,特别是当列表大小开始增长以后。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GdQpXs7R-1599024560319)(./image/列表的添加操作.jpg)]

三、元组(Tuple)

元组是固定且不可改变的。这意味着一旦元组被创建,和列表不同,它的内容无法被修改或它的大小也无法被改变。

>>> t = (1, 2, 3, 4)
>>> t[0] = 5
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

虽然它们不支持改变大小,但是我们可以将两个元组合并成一个新元组。这一操作类似列表的resize操作,但我们不需要为新生的元组分配任何额外的空间:

>>> t1 = (1, 2, 3, 4)
>>> t2 = (5, 6, 7, 8)
>>> t1 + t2
(1, 2, 3, 4, 5, 6, 7, 8)

如果我们将其与列表的append操作比较,我们会看到它的复杂度是O(n)而不是列表的O(1)。这是因为对元组每添加一个新元素都会有分配和复制操作,而不是像列表那样仅在额外的空间耗尽时发生。所以元组并没有提供一个类似append的自增操作,任意两个元组相加始终返回一个新分配的元组。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nIsaGxH8-1599024560321)(./image/元组的合并操作.jpg)]

该网站为Python Tutor,一个能够对python运行内存可视化的网站,非常适合初学者研究,在运行过程中内存发生了什么。

元组的静态特性的另一个好处体现在一些会在Python后台发生的事情:资源缓存。

Python是一门垃圾收集语言,这意味着当一个变量不再被使用时,Python会将该变量使用的内存释放回操作系统,以供其他程序(变量)使用。然而,对于长度为1~20的元组,即使它们不在被使用,它们的空间也不会立刻还给系统,而是留待未来使用。这意味着当未来需要一个同样大小的新的元组时,我们不再需要向操作系统申请一块内存来存放数据,因为我们已经有了预留的空间。

这看上去可能是个细微的好处,但是实际上是元组一个很神奇的地方:它们可以被轻松快速地创建,因为它们可以避免跟操作系统频繁的打交道,而后者会花很长的时间。

下面举个例子会非常直观的说明问题

In [1]: %timeit l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
93.7 ns ± 3.33 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)In [2]: %timeit t = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
18.5 ns ± 1.19 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

上面的示例中显示了初始化一个列表比初始化一个元组慢了5.1倍——如果这是在一个循环中,这点差别会很快的累加起来。

Python列表和元组的详细区别相关推荐

  1. Python列表和元组有什么区别?

    1. 可变性 列表是可变的,元组是不可变的 2. 存储空间 列表占用的空间较大,而元组占用较小的空间(在存储相同数据的情况下) 原因: 1.在创建列表时,开辟的空间不仅用来存储列表数据对象,还有一部分 ...

  2. python有哪几种基本数据类型_Python最基本的数据类型以及对元组的介绍 Python 中列表和元组有哪些区别...

    python的数据类型有哪些?道不同不相为谋,你讨厌我,我也未必喜欢你.各走各的人岂不是更潇洒何必咄咄逼人费了口舌也讨人嫌.你闲得慌,我可没空陪你. 1. 数字类型 Python数字类型主要包括int ...

  3. python列表和元组

    python列表和元组 1.列表 列表是Python中内置的有序可变序列,列表的所有元素放在一对中括号"[]"中,并使用逗号隔开,列表中元素的类型可以相同也可以不同. (1)列表的 ...

  4. 十二、深入Python列表和元组

    @Author :Runsen 上面四篇文章总结了Python的基础. 在Pthon中数据结构是非常重要的,所以下面将深入Pyhon数据结构 Python列表和元组总结 文章目录 什么是列表和元组 列 ...

  5. python两个元组相加_《第5章 Python 列表与元组》5.1.3 序列相加(Adding)!

    <高中信息技术 Python编程> 教学案<第5章 Python 列表与元组> 5.1.3 序列相加(Adding)! 06:15 1 #使用加号可以进行序列的连接操作,输入如 ...

  6. python 列表、元组、集合、字典、循环遍历数据结构

    python 列表.元组.集合.字典.数据结构的循环(整理自python文档) 列表-list-用方括号标注,逗号分隔的一组值 list 的 方法 对list添加.插入.删除.查找.排列.翻转 lis ...

  7. 任意长度的python列表最后一个元素索引_任意长度的 Python 列表、元组和字符串中最后一个元素的下标为 ________ 。_学小易找答案...

    [填空题]已知 x = [3, 5, 7] ,那么表达式 x[10:] 的值为 ____________ . [填空题]表达式 [x for x in [1,2,3,4,5] if x<3] 的 ...

  8. 任意长度的python列表最后一个元素索引_任意长度的Python列表、元组和字符串中最后一个元素的下标为...

    [填空题]Python内置函数__用来返回序列中的最小元素 [填空题]表达式 list(range(5)) 的值为 [填空题]表达式 int(4**0.5) 的值为 [填空题]表达式 3 or 5 的 ...

  9. 任意长度的python列表_任意长度的Python列表、元组和字符串中最后一个元素的索引为...

    任意长度的Python列表.元组和字符串中最后一个元素的索引为 答:-1 什么是软件工程? 答:百度定义:软件工程是一门研究用工程化方法构建和维护有效的.实用的和高质量的软件的学科.它涉及程序设计语言 ...

最新文章

  1. 目前的计算机聪原理上讲,计算机组成原理-第23-24讲(第7章)+课件.ppt
  2. go map的定义和使用 键值对存储
  3. 从 idea打包工程到dos下命令运行
  4. CBA - Success function for Create Oppt call
  5. html发送qq邮件消息,Python3实现发送QQ邮件功能(html)_python
  6. RocketMQ源码解析-Consumer启动(2)
  7. 拒绝经验过剩,“程序员的工作只能是代码”?
  8. Python+OpenCV:尺度不变特征变换 (SIFT, Scale-Invariant Feature Transform)
  9. 用最简单的方式理解和使用ActivityMQ(基础入门)
  10. 什么是串口协议转换器?串口转换器有哪些特点?
  11. 安徽农业大学计算机考研分数线,安徽农业大学历年考研分数线汇总[2012-2021]
  12. 关于7z各种不能用的操作解决办法 7za 7z x Error: Can not open file as archive there is no such archive
  13. Vuforia AR开发详细教程
  14. 累了,困了,来看“MySQL”,让你梦回吹角连营
  15. 微商引流用什么礼品?从而形成裂变传播
  16. 控制QTextEdit中字体颜色
  17. Infortrend混合存储推动大体量血站IT系统全面升级
  18. 数据库实验七——视图、索引及数据安全
  19. 排查处理Failed to find latest MicroserviceVersionMeta, appId=chw-apaas, microserviceName=fileservice
  20. 2022年道路运输企业主要负责人操作证考试题及答案

热门文章

  1. 对学计算机而言,学历重要吗?
  2. 数据库中的创建、修改、删除
  3. GitHub:全国各省市烂尾楼停贷汇总(持续更新)
  4. ARMv7和ARMv8的区别
  5. javascript实现随机点名
  6. 换了电脑装EA,旧电脑上的设置能转过去吗
  7. mysql数据库设计与应用答案智慧树_智慧树知到MySQL数据库设计与应用完整免费答案...
  8. JUC之 completableFuture
  9. UI自动化测试框架搭建-标记性能较差用例
  10. 墙裂推荐:GitHub 上这个开源项目可以让你在短短几分钟之内了解一门技术