这是在python面试中会经常问的一个问题
List和Tuple的区别
元组和列表最大的一个区别就是:是否可以修改
,列表是可以修改的,元组不支持修改(这是面试必须点出的)
可以理解为:tuple元组是一个只读版本的列表
存储方式
listdemo = []
>>> listdemo.__sizeof__()
40
>>> tupleDemo = ()
>>> tupleDemo.__sizeof__()
24
可以看到,对于列表和元组来说,虽然它们都是空的,但元组却比列表少占用 16 个字节,这是为什么呢?
事实上,就是由于列表是动态的,它需要存储指针来指向对应的元素(占用 8 个字节)。另外,由于列表中元素可变,所以需要额外存储已经分配的长度大小(占用 8 个字节)。但是对于元组,情况就不同了,元组长度大小固定,且存储元素不可变,所以存储空间也是固定的。
初始化的时间
对于静态变量,如果在内存中占用的空间不大,python会暂存这部分内存,这样的话在创建同样的元组时,python不需要向操作系统发出请求寻址,可以直接分配缓存的内存空间
元组的初始化速度要比列表快 5 倍。
当然,如果你想要增加、删减或者改变元素,那么列表显然更优。因为对于元组来说,必须得通过新建一个元组来完成。
总的来说,元组确实没有列表那么多功能,但是元组依旧是很重要的序列类型之一,元组的不可替代性体现在以下这些场景中:
- 元组作为很多内置函数和序列类型方法的返回值存在,也就是说,在使用某些函数或者方法时,它的返回值会元组类型,因此你必须对元组进行处理。
- 元组比列表的访问和处理速度更快,因此,当需要对指定元素进行访问,且不涉及修改元素的操作时,建议使用元组。
- 元组可以在映射(和集合的成员)中当做“键”使用,而列表不行。这会在后续章节中作详解介绍。
索引&切片
索引
python中基本数据类型,像字符串,列表,元组都是可以通过 索引
来获取其中的元素
python中的索引分为两类:正索引
与 负索引
,下边举例
l = [1, 2, 3]
l[1] # 2
l[2] # 3
l[4] # 报错 越界
l[-1] # 3
切片
python中数据类型支持通过切片
的方式获取元素,切片":" “::”,下面详细的介绍一下切片的操作
参考文章:https://blog.csdn.net/qiushangren/article/details/103550923?spm=1001.2014.3001.5501
上边有讲python中的下标就是索引有两套:一套正索引,一套负索引
s = 'python'
p y t h o n
正 0 1 2 3 4 5
负 -6 -5 -4 -3 -2 -1
对应位置的 正下标 - 负下标=len(a)
使用正下标时,下标i取值范围为0 <= i < len(a) 超出范围为越界
使用负下标时,下标i取值范围为-1>= i >-len(a)-1 超出范围为越界
数组操作中一般通过 ":" 和数字或变量的组合来灵活使用里面的元素 # ":" 一般表示循环
s[i:j:k] 意思就是从下标i开始到下标j结束(左闭右开) 步长为k(k为非0整数)
我这里以步长的正负帮助理解这些概念
当k > 0
i和j同号时 必须满足i < j 例如 s[1:2:1]='y' s[-2:-1:1]='0'
i和j异号时 必须满足i > j 例如 s[2:-2:1]='th' 但是注意 |正索引 - 负索引| < len(a) s[2:-4:2]=''
当k < 0
i和j同号时 必须满足i > j 例如 s[2:1:-1]='t' s[-1:-2:-1]='n'
i和j异号时 必须满足i < j 例如 s[2:-1:-1]='oht' 但是注意 |正索引 - 负索引| < len(a) s[-1:5:-1]=''