
2.5 列表
在编程时,不仅要处理复杂的逻辑运算,还要处理复杂逻辑运算带来的复杂数据结构。如果使用简单的数字类型来表达复杂的数据,就会存在大量的简单数据对象,存放和管理这些对象将成为麻烦的问题。为了解决这个问题,以列表(List)为代表的容器数据类型诞生了。本节将通过列表的用法来解决一些复杂的数学问题,甚至是算法问题。
2.5.1 List定义
在介绍列表List之前,让我们先回顾一下前面关于变量赋值时内存知识——变量赋值时传递的并不是数值而是内存地址。一台计算机的系统内存可以被看作是购物商场的地下停车场。大家都知道停车场内的车位都是按一定顺序编号的,当一辆汽车开进停车场,就好比内存分配一个地址给变量。当我们想要创建一个列表时(注意,这里是分配一大块系统内存),就好比停车场进来了一队车,一下子去申请了N个连续的车位。
例2-31 列表赋值

列表用于组织零散的数据元素,中括号之间用逗号来分割数据元素。列表的值不一定是同一类型的值,就像停车位既可以停放BMW,也可以停放奔驰一样。
和字符串一样,列表也以地址0开始,可以被切片、连接。
例2-32 列表元素访问

列表也可以改变每个独立元素的数值。
例2-33 修改独立元素

例2-34 添加独立元素


2.5.2 索引和切片
列表也能进行切片操作,甚至可以改变列表的大小。
例2-35 列表的索引和切片

park[0:3]表示从索引0开始取,直到索引3为止,但不包括位于索引3的元素。即索引0、1、2正好是3个元素。如果第一个索引为0,还可以省略掉0,写成park[:3]。
2.5.3 反转
列表的反转是很常见的需求,为了方便理解,这里用数字元素来举例。反转这个功能需要引入新的函数reversed。
例2-36 列表反转操作

还有一种更简单的方法。
例2-37 用分片的方法反转


在a[: :-1]中,[: :-1]代表从后向前取值,每次步进值为1,a[3::-1]=[4,3,2,1]代表从第3个坐标往前反转顺序输出,每次取1个值。