跳转至

4.5 数据类型基础——列表

内容梗概

本课讲解 Python 的列表(list)。老师指出 Python 中没有 C/Java 那样的数组概念,把多项数据放进一个变量访问的结构就是列表,并强调列表是**可变序列**——与字符串(不可变序列)形成对照,但二者同为序列,索引、切片、拼接等操作完全一致。课程演示了列表的三种创建方式(方括号字面量、list() 函数、列表推导式)、元素类型可混合与嵌套、元素赋值修改、+ 拼接和 append() 追加,并辨析了 append 一次只能加一个元素的区别。因列表操作较繁琐,演示改在 VS Code 中进行。

知识点详解

什么是列表

  • (约 00:00) 要把很多项放在一起、当成一个变量/对象访问时,用列表。Python 没有数组概念,列表是最常见的同类结构。
  • (约 00:12) 列表是 Python 中的**可变序列**:可以访问其中某个元素并改变它的值;而字符串是不可变序列。
  • (约 00:17) 字符串和列表都是序列,操作类似:字符串的大部分操作放到列表上完全一致,列表只因"可变"多出若干操作。

列表的创建方式

  • (约 00:26) 方式一:方括号字面量。[] 创建空列表;元素用逗号分隔,逗号后加不加空格只是美观问题。
  • (约 00:33) 列表特点:元素类型可以不一样,甚至可以嵌套列表本身。如 [1, 'a', [x, y]] 共 3 个元素(课堂互动提问),其中第三项本身是个含 2 个元素的列表——"真正的套娃"。
  • (约 02:02) 内置函数 len() 查看列表长度,例中结果为 3。
  • (约 02:45) 方式二:list() 函数。一般用于创建空列表,或传入一个可迭代对象;list() 只接收一个参数,list(1, 2, 3) 会报错。
  • (约 03:07) list(range(4)):range 生成 0、1、2、3,把这种 range 返回的东西叫**迭代器**(进阶内容,后面课程再讲);现在只需记住 list() 里要么为空、要么传可迭代对象。
  • (约 08:08) 方式三:列表推导式。如 [x for x in range(4)]:从可迭代对象中逐一取出元素,可对每个元素做额外操作后放入新列表。先留个印象,暂时不会用没关系。
  • (约 10:05) 应用示例:生成 0~9 的平方列表 [x * x for x in range(10)](range 与切片一样取不到终点值 10)。
  • (约 11:15) 答疑:推导式中可以用其他列表代替 range,甚至字符串也可以迭代;只要对象"可迭代"(能循环取出元素)就能用于列表推导式。这叫"语法糖"。

索引与切片

  • (约 12:59) 列表索引与字符串**一模一样**:从 0 开始,反向从 -1 开始;切片语法与字符串取子串完全一致,不重复展开。

可变序列:元素赋值

  • (约 13:17) 与字符串的关键不同:列表可以**直接对元素赋值**。如 a[2] = 'hello world' 后,列表第三项被覆盖为新内容——这正是"可变"的含义。

拼接与 append

  • (约 14:27) 拼接与字符串一样用 + 号。购物车例子:['口罩', '洗手液'] + ['...', '...'] 后变成 4 个元素。
  • (约 15:31) 新函数 append():在列表**尾部追加一个元素**。
  • (约 16:46) 易错点:append 每次只接收一个参数。a.append([1, 2]) 会把整个列表当作一项塞进去(嵌套);a.append(1, 2) 直接报错 TypeError: append() takes exactly one argument。想一次展开加入多个元素要用 + 拼接,如 a + [1, 2]。
  • (约 18:04) 字符串没有 append,这是列表(可变序列)特有的操作。

for ... in 遍历(预告)

  • (约 15:48) 答疑:同学问 for x in ... 是不是遍历——是的,与 C 语言的 for 循环作用相同但用法有差异,下节课讲循环控制语句时展开。

示例与演示

  • 在 VS Code 中演示(列表操作较繁琐,不用交互模式)。
  • 创建混合类型列表 [1, 'a', [...]],互动提问元素个数(答案 3),len() 验证。
  • 演示 list(1, 2, 3) 报错、list(range(4)) 得到 [0, 1, 2, 3]。
  • 列表推导式:[x for x in range(4)]、[x*x for x in range(10)] 生成平方列表;尝试对字符串迭代。
  • 演示 a[2] = 'hello world' 修改元素。
  • 购物车拼接示例;演示 append 追加单元素、append 列表变嵌套、append 两个参数报错。

重点与难点

  • 可变 vs 不可变:列表可变(支持元素赋值、append),字符串不可变——这是本章的主线对比。
  • 序列共性:索引、负索引、切片、+ 拼接与字符串完全一致,可迁移学习。
  • 嵌套与计数:列表里套列表,外层只算一个元素;len() 数的是顶层元素个数。
  • list() 只收一个参数;append() 只收一个参数(塞列表会变嵌套,不是展开)。
  • range 返回的是迭代器;列表推导式是语法糖,暂时会用即可,迭代章节再深入。

关联内容

  • 承上:直接复用 4.2 字符串的索引/切片/拼接知识,并以"可变/不可变序列"与字符串对照。
  • 启下:for ... in 遍历、迭代器/可迭代对象在后续循环控制语句与迭代章节展开;列表推导式在迭代期详讲。
  • 数据类型进阶将讲元组、字典等更多可放进列表的类型。
  • 前置知识:range 在此前课程中已简单提过。