列表

未匹配的标注

我们内置对象之旅的下一站是列表。列表是Python最灵活的有序集合对象类型。不像字符串,它可以包含任何对象类型:数字、字符串、甚至其它列表。而且,不像字符串,列表可以被就地修改——通过给偏移量赋值、切片、列表方法调用、删除语句等等——它们是可变对象。

Python列表完成了许多在底层语言与C中可能必须手动实现的集合数据结构的工作。下面是它们主要属性的快速浏览:

任意对象的有序集合

从功能的角度,列表只是收集其它对象的地方,所以可以将它们当做组。列表还在它们包含的项中维护了一个从左到右的位置排序(也就是说:它们是序列)。

通过偏移量访问

和字符串一样,可以通过根据对象的偏移量对列表进行索引,来从列表中获取一个组件对象。因为列表中项目是按照他们的位置排序的,所以还可以完成如切片和连接等任务。

变长、混杂的、任意嵌套的

不像字符串,列表可以就地增缩(它们的长可以变化),且可以包含任何类型的对象,不只是单字符的字符串(它们是混杂的)。因为列表可以包含其它的复杂对象,所以还支持任何嵌套:可以创建列表的列表的列表等等。

属于类别“可变的序列”

就我们的类型类别修饰语而言,列表是可变的(也就是说:能被就地修改)且响应所有和字符串一起使用的序列操作,如索引,切片和连接。事实上,序列操作在列表上和字符串上是一样的;唯一区别是当如连接和切片的序列操作应用在列表上时,返回新列表而非新字符串。然而,因为列表是可变的,它们还支持字符串不支持的其它操作,比如删除和索引赋值操作,这些操作就地修改了列表。

对象引用的数组

技术上讲,列表包含0或多个到其它对象的引用。如果有其它语言的背景,列表可能让你想起指针(地址)。从Python列表获取一个项大概和索引一个C语言的数组一样快;事实上,列表其实是标准Python解释器内的数组,而不是链接结构。然而,在第6章中学过:不管何时使用引用,Python总是跟着到对象的引用,所以程序只处理对象。不管何时分配对象给数据结构组件或变量名时,Python总是存储到那个同样对象的引用,而不是它的拷贝(除非你明确请求一个拷贝)。

作为预览和参考,表8-1总结了常见和有代表性的列表对象操作。对Python 3.3来说,它相当完整,但要获取完整的信息,请参考Python标准库手册,或交互式地运行 help(list)dir(list) 来获取列表方法的一个完整列表——可以传入一个真的列表,或单词 list,它是列表数据类型的名称。这里的这套方法很容易被修改——事实上,有两个是从3.3中新增的。

image-20230303200937203

image-20230303201021989

当被写作一个字面量表达式时,列表被编码为方括号中(被逗号分隔)的一系列对象(其实,是返回对象的表达式)。比如,表8-1第二行给变量L分配一个四项组成的列表。嵌套列表被编码为嵌套的方括号系列(行3),空列表只是一对里面没有任何东西的方括号(行1)。[18]

表8-1中的许多操作都应该看起来很熟悉,因为它们是我们之前应用在字符串上的同样的序列操作——索引、连接、迭代等等。列表还响应于列表特定的方法调用(它提供了如排序、反转、往末尾添加项等各种实用程序),还有就地修改操作(删除项、给索引和切片赋值等等)。列表有这些工具用于变更操作,因为他们是一个可变的对象类型。


Note18

在实践中,在列表处理程序中不会看到有很多列表像这样写出来。更常见的是看到处理动态构建的列表的代码(在运行时),从用户输入,文件内容等等。事实上,虽然精通字面量语法很重要,但Python中的许多数据结构是通过在运行时运行程序代码来构建的。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~