列表和元组,都是一个可以放置任何数据类型的有序集合。
列表的特性
动态的(mutable):长度大小不固定,可以随意地增加、删减或者改变元素。
会修改原来列表中的元素,而不会创建新的列表。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# 新建一个列表 l = [ 1 , 2 , 'hello' , 'world' ] # 输出列表 l # 显示内容 [ 1 , 2 , 'hello' , 'world' ] # 访问列表元素 l[ 3 ] = 3 # 列表允许访问第4个元素,并修改 # 输出列表 l # 显示内容 [ 1 , 2 , 'hello' , 3 ] # 添加元素 l.append( 5 ) # 把元素5 添加到列表后面 # 输出列表 l # 显示内容 [ 1 , 2 , 'hello' , 3 , 5 ] |
元组的特性
静态的(immutable):长度大小固定,无法增加删减或者改变。
若要改变元组内的数据,只能新开一块内存,新建一个元组。
1
2
3
4
5
6
7
8
9
10
11
12
|
# 新建一个元组 tup = ( 'jason' , 22 ) # 输出元组 tup # 显示内容 ( 'jason' , 22 ) # 不能对元组直接操作,需要新建一个新元组 net_tup = tup + ( 5 , ) # 创建新的元组new_tup 后,以此填充元素,新增元素后的',' 不可以省略 # 输出元组 net_tup # 显示内容 ( 'jason' , 22 , 5 ) |
两者支持的操作
负数索引
列表和元组都支持负数索引,-1 表示倒数第一个元素,-2 表示倒数第二个,以此类推。
1
2
3
4
5
6
7
8
|
l = [ 1 , 2 , 'hello' , 3 , 5 ] l[ - 1 ] # 列表的负数索引 # 显示内容 5 tup = ( 'jason' , 22 ) tup[ - 1 ] # 元组的负数索引 # 显示内容 22 |
切片操作
切片操作指的是,输出规定范围内 [start : end]的所有元素,但不包含最后一位。
例如 [0:3] 就是从下标0 开始,一直输出到下标2(3-1) 。
1
2
3
4
5
6
7
8
|
l = [ 1 , 2 , 'hello' , 3 , 5 ] l[ 0 : 3 ] # 列表的切片操作 # 显示内容 [ 1 , 2 , 'hello' ] tup = ( 'jason' , 22 ) tup[ 0 : 2 ] # 元组的切片操作 # 显示内容 ( 'jason' , 22 ) |
随意嵌套
1
2
3
4
5
6
7
8
|
new_l = [[ 1 , 2 , 3 ], [ 4 , 5 ]] # 嵌套列表 new_l # 显示内容 [[ 1 , 2 , 3 ], [ 4 , 5 ]] new_tup = (( 1 , 2 , 3 ,), ( 4 , 5 , 6 )) # 嵌套元组 new_tup # 显示内容 (( 1 , 2 , 3 ), ( 4 , 5 , 6 )) |
相互转换
1
2
|
list (( 1 , 2 , 3 )) # list() 函数把元组转化成列表 tuple ([ 1 , 2 , 3 ]) # tuple() 函数把列表转化成元组 |
常用内置函数
count(item) 统计列表 / 元组中 item 出现的次数
- index(item) 返回列表 / 元组中 item 第一次出现的索引
-
list.reverse() and list.sort() 只能对列表应用
- list.reverse() 原地倒转列表
- list.sort() 排序
-
reversed() and sorted()
-
reversed() 对列表 / 元组进行倒转
- 返回一个倒转后的迭代器,使用list() 将其转换成列表
-
reversed() 对列表 / 元组进行倒转
-
sorted() 对列表 / 元组进行排序
- 返回排好序的新列表
存储方式的差异
1
2
3
4
5
6
|
l = [ 1 , 2 , 3 ] l.__sizeof__() 64 tup = ( 1 , 2 , 3 ) tup.__sizeof__() 48 |
存储同样的内容,列表却比元组多用了16字节。
- 列表是动态,需要指针来指向对应的元素。
- 列表它可变,需要额外存储已经分配的长度大小,追踪列表空间使用的情况,当空间不足时,可以及时分配额外空间。
- 存储指针的空间长度的存储空间各为8 字节。
列表初始空间是:40,添加字符后会扩展4个元素的空间:32,所以是:72字节。当需要存储的元素空间大于存储空间时,列表会新增4个元素的空间:32。
这样的增加 / 删减操作机制(over-allocating)保证了其操作的有效性,增加 / 删减的时间复杂度均为O(1)
性能对比
元组比列表更加轻量级一些,从总体来讲,元组的性能速度要略优于列表。
Python 会在后台对静态数据做一些资源缓存(resource caching)
垃圾回收机制,当一些变量不被使用了,Python 就会回收它们所占用的内存,返还给操作系统,以便其他变量或其他应用使用。
但元组不被使用并且占用空间不大时,Python 会暂时缓存这一部分。下次调用时,Python 会直接用这块缓存的内存空间,大大加快程序的运行速度。
初始化一个相同元素的列表和元组,元组的速度比列表快5倍。
索引操作,两者速度差别非常小,几乎可以忽略不计。
增加 / 删减或改变元素,列表更优。元组需要新建一个元组。
两者的使用场景
存储的数据和数量不变,选用元组合适。存储的数据或数量是可变的,选择列表更合适。
总结
列表和元组都是有序,可以存储任何数据类型的集合。
区别:
列表是动态,长度可变。可以增加、删除、修改元素,存储空间略大于元组,性能略逊于元组。
元组是静态的,长度固定。不可以对元素进行操作,元组对于列表来说更加轻量级,性能稍优。
提问:两个创建空列表的方法,哪个更快。
1
2
3
4
|
# option A empty_list = list () # option B empty_list = [] |
自答:我认为option B 更快一些,它直接创建了一个空列表。但option A 是通过list() 进行转换的。
解答:[ ] 是一个内置的C 函数,直接被调用。而list 是一个function call,Python 的function call 会创建stack,并且进行一系列参数检查的操作,比较expensive。
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!
原文链接:https://blog.csdn.net/weixin_43776724/article/details/120856567