Python 核心技术与实战
景霄
Facebook 资深工程师
114324 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
Python 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

03 | 列表和元组,到底用哪一个?

元组存储空间较少
列表空间分配过程
不可变
长度固定
可增删改元素
长度可变
使用列表或元组的场景
创建空列表的效率和选择
存储数据或数量可变
存储数据和数量不变
索引操作速度
初始化速度
资源缓存
元组轻量级
存储空间
sort
reverse
index
count
相互转换
嵌套
切片操作
负数索引
元组是静态的
列表是动态的
数据类型不一致
有序集合
思考题
使用场景
性能
存储方式的差异
常用内置函数
基本操作和注意事项
区别
基础概念
列表和元组

该思维导图由 AI 生成,仅供参考

你好,我是景霄。
前面的课程,我们讲解了 Python 语言的学习方法,并且带你了解了 Python 必知的常用工具——Jupyter。那么从这节课开始,我们将正式学习 Python 的具体知识。
对于每一门编程语言来说,数据结构都是其根基。了解掌握 Python 的基本数据结构,对于学好这门语言至关重要。今天我们就一起来学习,Python 中最常见的两种数据结构:列表(list)和元组(tuple)。

列表和元组基础

首先,我们需要弄清楚最基本的概念,什么是列表和元组呢?
实际上,列表和元组,都是一个可以放置任意数据类型的有序集合
在绝大多数编程语言中,集合的数据类型必须一致。不过,对于 Python 的列表和元组来说,并无此要求:
l = [1, 2, 'hello', 'world'] # 列表中同时含有intstring类型的元素
l
[1, 2, 'hello', 'world']
tup = ('jason', 22) # 元组中同时含有intstring类型的元素
tup
('jason', 22)
其次,我们必须掌握它们的区别。
列表是动态的,长度大小不固定,可以随意地增加、删减或者改变元素(mutable)。
而元组是静态的,长度大小固定,无法增加删减或者改变(immutable)。
下面的例子中,我们分别创建了一个列表与元组。你可以看到,对于列表,我们可以很轻松地让其最后一个元素,由 4 变为 40;但是,如果你对元组采取相同的操作,Python 就会报错,原因就是元组是不可变的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Python中的列表和元组是两种常见的数据结构,它们在存储方式和特性上有着明显的区别。列表是动态的、可变的,而元组是静态的、不可变的。本文从基础概念入手,清晰地阐述了列表和元组的定义和区别。通过对比列表和元组的基本操作和注意事项,读者可以快速掌握它们的用法和特点。此外,文章还深入探讨了列表和元组的存储方式差异,指出了它们在存储空间上的差异,以及Python在空间分配上的机制。通过这些内容,读者可以更好地理解列表和元组在实际应用中的差异和适用场景。文章还提到了列表和元组的性能比较,指出元组在初始化速度上优于列表。最后,根据它们的特性,文章给出了列表和元组的使用场景建议,帮助读者在实际应用中做出选择。整体而言,本文通过清晰的例子和详细的解释,为读者提供了全面的关于列表和元组的知识,适合初学者快速了解Python中这两种重要的数据结构。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Python 核心技术与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(241)

  • 最新
  • 精选
  • 和你一起搬砖的胡大爷
    老师能不能讲一下list和tuple的内部实现,里边是linked list 还是array,还是把array linked一下这种。 最后那个问题,类比java,new 是在heap,直接声明就可能在常量区了。老师能讲下Python的vm么,比如内存分配,gc算法之类的。

    作者回复: 1. list和tuple的内部实现都是array的形式,list因为可变,所以是一个over-allocate的array,tuple因为不可变,所以长度大小固定。具体可以参照源码list: https://github.com/python/cpython/blob/master/Objects/listobject.c. tuple: https://github.com/python/cpython/blob/master/Objects/tupleobject.c 2. 最后的思考题: 区别主要在于list()是一个function call,Python的function call会创建stack,并且进行一系列参数检查的操作,比较expensive,反观[]是一个内置的C函数,可以直接被调用,因此效率高。 内存分配,GC等等知识会在第二章进阶里面专门讲到。

    2019-05-15
    8
    231
  • 布霆
    老师请问一下,为什么l = [1, 2, 3]消耗的空间为64字节,而l.append(1), l.append(2), l.append(3)消耗的空间为72字节,这不是相同的列表吗?

    作者回复: 列表的over-allocate是在你加入了新元素之后解释器判断得出当前存储空间不够,给你分配额外的空间,因此 l=[], l.append(1), l.append(2), l.append(3)实际分配了4个元素的空间。但是l=[1, 2, 3]直接初始化列表,并没有增加元素的操作,因此只会分配3个元素的空间

    2019-05-15
    2
    87
  • Geek_59f23e
    1、用list()方法构造一个空列表使用的是class list([iterable])的类型构造器,参数可以是一个iterable,如果没有给出参数,构造器将创建一个空列表[ ],相比较而言多了一步class调用和参数判断,所以用 [ ] 直接构造一个空列表的方法速度更快,刚查的官方解释,不知道我理解的对不对。。。 2、敲代码的时候我一般元祖用来传参用的比较多,能用元祖的地方尽量不用列表,这样代码性能好些。

    作者回复: 1. 区别主要在于list()是一个function call,Python的function call会创建stack,并且进行一系列参数检查的操作,比较expensive,反观[]是一个内置的C函数,可以直接被调用,因此效率高 2. 嗯嗯

    2019-05-15
    23
  • kevinsu
    可以这样比较吗?老师 import time time1 = time.clock() empty_list = list() time2 = time.clock() diff_time = time2 - time1 print (diff_time) import time time1 = time.clock() empty_list = [] time2 = time.clock() diff_time = time2 - time1 print (diff_time)

    作者回复: 这样可以,但是不是很准确,尤其对于简单并且运行速度很快的代码块,建议用timeit。 因为程序中还有很多因素会影响计算的时间,比如垃圾回收机制。使用timeit会自动关掉垃圾回收机制,让程序的运行更加独立,时间计算更加准确。

    2019-05-15
    3
    23
  • Mr.Chen
    老师,“有序”应该怎么理解。

    作者回复: 内部的排列是有序的,比如你遍历一遍并打印,其顺序应该和你插入元素的顺序一样

    2019-10-10
    10
  • Geek_59f23e
    实测被打脸了😂函数构建和直接构建一个空列表或数组速度上并没有什么差别,有时前者快些,有时后者快些。。。 In [1]: timeit 'lst1 = []' 9.86 ns ± 0.721 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each) In [2]: timeit 'lst2 = list()' 9.82 ns ± 0.43 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each) In [3]: timeit 'tup1 = (,)' 9.59 ns ± 0.294 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each) In [4]: timeit 'tup2 = tuple()' 9.75 ns ± 0.464 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

    作者回复: 你的命令有些奇怪。在程序里也应该是timeit(...),试过用文中的命令测试的结果吗? 另外你python的版本和运行环境的截图能贴一下吗?

    2019-05-15
    3
    8
  • 安亚明
    老师,PYTHON学校为何要从元组和列表开始。

    作者回复: 因为这是最基本的数据结构啊,学语言肯定得先了解数据结构啊

    2019-05-15
    7
  • lizhaochao
    list的内部实现是over-allocate array的形式 1. 那在需要扩容的时候,是不是也是需要重新开辟一块连续的内存空间呢? 2. 每次扩容都会预留一些空间,这里面有没有公式,公式是什么呢

    作者回复: 1. 是的 2. 你可以自己overallocate的pattern一般是0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...

    2019-05-15
    7
  • 蒋腾飞同学
    非常涨姿势,一般的课程肯定不会有的~

    作者回复: 感谢你的认可

    2019-08-29
    4
  • 武林秀才
    reversed()返回的是一个反转的迭代器,不是返回倒排的列表或元组。

    作者回复: 是的。但是我这里只是以列表和元祖为例,迭代器的概念第二大章才讲到

    2019-05-16
    3
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部