一.列表和元组的使用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⼀.列表和元组的使⽤
列表和元组是Python最常⽤的基本数据结构,我们来⽐较⼀下两者的特点
列表和元组的特点
1.列表和元组是⼀个可以放置任何数据类型的有序集合。
>>> list = [1,2.2,'abc']
>>> list
[1, 2.2, 'abc']
>>> tuple = (1,2.2,'abc')
>>> tuple
(1, 2.2, 'abc')
可以看出来,在同⼀个列表或元组⾥是可以有不同类型的数据的。
(在上⾯的例⼦中就包含了⼀个int,⼀个float和⼀个str。
)
2.Python⾥的列表和元组都⽀持负数索引、切⽚操作和随意的嵌套
3.Python⾥的列表和元组可以通过list()和tuple()随意转换
列表和元组的区别
※列表是动态的,长度和⼤⼩不固定,可以随时追加、删减和修改元素
>>> list = [1,2.2,'abc']
>>> list.append('aaa')
>>> list[0]=123
>>> list
[123, 2.2, 'abc', 'aaa']
※元组是静态的,长度和⼤⼩是固定的,⽆法增加、删减和修改。
>>> tuple = (1,2.2,'abc')
>>> tuple[0]=123
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
在对元组修改时,就会有错误抛出。
可是如果想要修改元组,那该怎么办呢?就要重新开⼀块内存,创建⼀个新的元组。
就像要把⼀个元组加⼀个元素,就要这么办
>>> tuple = (1,2,3,4,)
>>> tuple_new = tuple+(5,)
>>> tuple_new
(1, 2, 3, 4, 5)
创建了⼀个新的元组,两个元组和在⼀起。
列表和元组存储⽅式的差异
我们先创建两个⼀样内容的列表和元组,再看⼀看他们占⽤的存储空间
>>> list = [1,2,3]
>>> list.__sizeof__() #显⽰存储空间
64
>>> tuple = (1,2,3)
>>> tuple.__sizeof__()
48
可以看出来列表要⽐元组多出来16个字节,但是他们的内容是相同的。
为什么呢?
因为列表是动态的,他需要存储指针来指向对应的元素(上⾯的例⼦中由于数据都是int型,占⽤8个字节)。
另外,由于列表可变,所以需要额外存储已经分配的长度⼤⼩(8字节),当控件不⾜时,会会及时分配额外空间。
我们可以试⼀下
>>> list = []
>>> list.__sizeof__() #空列表,存储空间为40字节
40
>>> list.append(1)
>>> list.__sizeof__() #加⼊1个元素,列表围棋分配了可以存储4个元素的空间(72-40)/8=4
72
>>> list.append(2)
>>> list.__sizeof__() #同上
72
>>> list.append(3)
>>> list.__sizeof__() #同上
72
>>> list.append(4)
>>> list.__sizeof__() #同上
72
>>> list.append(5)
>>> list.__sizeof__() #加⼊了第5个元素,列表的空间不⾜,有额外分配了可以存储4个元素的空间
104
空的列表所占⽤的内存是40字节,在添加⼀个元素后直接预留了4个元素的空间(4*8=32字节)。
再添加4个元素预留的32个字节全部占⽤,再⼀次添加时会再⼀次预留32个字节。
这就是列表空间分配的过程。
为了减少每次增加、删减操作时空间分配的开销,Python每次分配空间的时候都会额外的多分配⼀些。
这样的机制(over-allocationg)保证了操作的⾼效性:增加/删减的事件复杂度为O(1)。
⽽对元组来说,由于其长度⼤⼩固定,元素也不可变,所以每次分配的空间是不会变的。
列表和元组的性能差异
通过上⾯⼀节列表和元组在存储⽅式上的差异总结⼀下:元组是⽐列表更轻量级的数据结构,所以总体上来说,元组的性能速度要略优于列表。
此外,Python在后台会对静态数据做⼀些资源缓存(resource caching)。
就是说由于垃圾回收机制的存在,有些变量不被使⽤
了,Python就会回收他们所占⽤的资源交还给操作系统,以便于其他的变量或应⽤使⽤。
⽽对于这些静态变量,由于他不被使⽤并且占⽤的空间不⼤时,Python会暂时缓存这部分内存,这样下次我们再创建同样⼤⼩的变量时Python就不需要想操作系统发出请求去寻找内存,⽽是从之前缓存的内存空间⾥寻找。
这样就能⼤⼤加快程序的运⾏速度。
总结
·列表是动态的,长度可变,存储控件略⼤于元组,性能略逊于元组。
·元组是静态的,长度⼤⼩固定。
相对于列表更轻量级,性能稍优,在传递参数的时候可以考虑使⽤元组。
想⼀想
创建⼀个空的列表可⽤下⾯两种⽅式
#option A
empty_list = list()
#option_B
empty_list = []
哪种效率⾼呢?
对了,是第⼆种。
因为list()是调⽤了⼀个函数,Python的function call会创建stack并进⾏⼀系列参数检查操作,⽽[]是⼀个内置的C函数,可以直接调⽤,效率会更⾼。