03 | 列表和元组,到底用哪一个?
该思维导图由 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-158231 - 布霆老师请问一下,为什么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-15287 - Geek_59f23e1、用list()方法构造一个空列表使用的是class list([iterable])的类型构造器,参数可以是一个iterable,如果没有给出参数,构造器将创建一个空列表[ ],相比较而言多了一步class调用和参数判断,所以用 [ ] 直接构造一个空列表的方法速度更快,刚查的官方解释,不知道我理解的对不对。。。 2、敲代码的时候我一般元祖用来传参用的比较多,能用元祖的地方尽量不用列表,这样代码性能好些。
作者回复: 1. 区别主要在于list()是一个function call,Python的function call会创建stack,并且进行一系列参数检查的操作,比较expensive,反观[]是一个内置的C函数,可以直接被调用,因此效率高 2. 嗯嗯
2019-05-1523 - 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-15323 - Mr.Chen老师,“有序”应该怎么理解。
作者回复: 内部的排列是有序的,比如你遍历一遍并打印,其顺序应该和你插入元素的顺序一样
2019-10-1010 - 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-1538 - 安亚明老师,PYTHON学校为何要从元组和列表开始。
作者回复: 因为这是最基本的数据结构啊,学语言肯定得先了解数据结构啊
2019-05-157 - lizhaochaolist的内部实现是over-allocate array的形式 1. 那在需要扩容的时候,是不是也是需要重新开辟一块连续的内存空间呢? 2. 每次扩容都会预留一些空间,这里面有没有公式,公式是什么呢
作者回复: 1. 是的 2. 你可以自己overallocate的pattern一般是0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
2019-05-157 - 蒋腾飞同学非常涨姿势,一般的课程肯定不会有的~
作者回复: 感谢你的认可
2019-08-294 - 武林秀才reversed()返回的是一个反转的迭代器,不是返回倒排的列表或元组。
作者回复: 是的。但是我这里只是以列表和元祖为例,迭代器的概念第二大章才讲到
2019-05-163