一、列表和元祖
python中最常见的两种数据结构:列表(list)和元祖(tuple);
列表和元祖都是有序的,可以放置任意数据类型的有序集合,在大多数编程语言中,集合的数据类型必须一致,但对于列表和元祖来说并无此要求;列表和元祖都支持负数索引,-1表示最后一个元素,-2表示倒数第二个元素‘列表和元祖支持切片操作,括号为前闭后开;可通过list()和tuple()函数相互转化;二、区别
列表是动态的,可以随意增加、删除、修改元素(mutable);元祖是静态的,长度固定,无法增加、删减或改变(imutable);若果元祖想要增加元素,需要开辟一块新的内存,创建新的元祖后,再将原来元祖的值填充进去;
列表和元祖存储方式的差异,放置相同元素,元祖的存储空间要比列表少8字节(自己实践是8字节,但是课程中讲要少16字节),因为列表还需要存储指针,来指向对应的元素,由于列表可变,还需要存储已经分配的长度大小,当空间不足时,会额外分配空间;列表和元祖性能的差异,元祖比列表更轻量一些,所以元祖的性能要略优于列表;python在后台会对静态数据做缓存,所以下次在创建同样大小的元祖时,python就不用向操作系统发起请求申请缓存,而是直接分配之前已经缓存的内存空间,这样可大大加快程序的运行速度; 元祖的初始化速度要比列表快5倍;索引操作两者几乎没有影响;新增、修改、删除操作时,列表的性能要优于元祖,因为对于元祖,要生成一个新的元祖;三、使用场景
如果存储的数据和数量不变,后台数据直接返回给前端渲染,则可使用元祖更合适;如果存储的数据和数量是可变的,如日志功能统计用户浏览的帖子数,则使用列表更合适;l = [3, 2, 3, 7, 8, 1]
l.count(3) //元素出现的次数
2
l.index(7) //元素所在列表/元祖第一次出现的位置
3
l.reverse()
l
[1, 8, 7, 3, 2, 3]
l.sort()
l
[1, 2, 3, 3, 7, 8]
tup = (3, 2, 3, 7, 8, 1)
tup.count(3)
2
tup.index(7)
3
list(reversed(tup)) //元祖进行反转后生成一个新的元祖
[1, 8, 7, 3, 2, 3]
sorted(tup) //元祖进行排序后生成一个新的元祖
[1, 2, 3, 3, 7, 8]