python中的序列类型有哪些:支持下标索引访问的数据容器

python中的序列类型有哪些:支持下标索引访问的数据容器

上次对着代码调试的时候,脑子里突然卡住,python中的序列类型有哪些这个问题本来以为随口就能说全,结果写自测代码的时候漏掉了字符串,折腾好半天。那会敲着键盘,一会在终端里试切片,一会翻自己之前随手记的笔记,越想越乱,总把可迭代对象和序列混在一起,以为只要能用for循环遍历的就都算序列,踩了这个不算小的误区。

最先确认下来的是列表,这个是平时写脚本用得最多的,能增删改里面的元素,方括号包裹,随便改里面的值,做临时存数据的容器很顺手。写批量处理文本的小脚本时,大量零散数据都往列表里丢,想改哪一项直接按索引赋值就行,用起来很灵活。

然后是元组,圆括号包起来,定义之后里面内容不能改动,一开始总觉得元组没什么用处,明明列表能干更多事。后来才反应过来,有些固定不变的数据,比如配置参数坐标这类,放元组里更稳妥,不会在别的地方被误修改。切片操作和列表写法差不多,同样支持索引取值,只是没法修改内部元素。

字符串也算序列这件事,就是我之前卡壳的地方。一直下意识把字符串单独划出去,忘了单个字符也可以通过下标拿出来,也能做切片截取一段文字。循环遍历字符串的时候,拿到的就是一个个字符,和列表遍历的逻辑是相通的,只是字符串本身同样不可变,不能直接修改里面某个位置的字符,想要改动只能拼接生成新字符串。

还有range对象,这个很多人容易忽略。写for循环的时候经常写range(),打印出来看着不像普通容器,但它确实属于序列类型。它不会一次性把所有数字都存进内存里,只记录起始、结束和步长,数据量大的时候省不少内存,不过它里面的元素不能修改,只能用来生成连续数字,支持索引和切片操作。

这只是我的个人感受,不是标准答案。

字节数组和字节串我接触的相对少一点,处理二进制数据的时候才会碰到。字节串用b开头,存的是字节数据,不可变;字节数组bytearray是可变版本,可以修改里面字节的值,文件读写、网络传输处理二进制流的时候才会用到,日常写普通业务脚本很少会主动去写这两种。

当时整理的时候还特意去区分集合和字典,这两个经常被一起拿出来对比,但它们不属于序列。集合无序,没有索引;字典以前版本也不支持下标按顺序取,是键值映射结构,不能靠数字下标访问,这点要分开。那段时间反复在终端里测试,拿索引去访问集合,一运行就抛出报错,才算牢牢分清边界。

之后写代码的时候,判断一个东西是不是序列,我自己习惯先试两件事,能不能用数字下标取值,能不能切片。能通过这两个测试,在我这边就先归到序列里,当然这个判断方式也有局限,不一定适配所有场景。

到现在敲代码,偶尔还是会一瞬间恍惚,分不清range是不是序列。不会死记硬背清单,更多是靠平时写代码试错留下的印象,知道每一种序列各自的可变特性,知道什么时候该挑哪一种来存数据,而不是单纯背下这几个名字。

关掉终端的时候,屏幕上还留着几行用来验证切片的测试代码,没删。