TheZTHEZ / UNDERSTANDING FIRST
Python 入门入门19 分钟阅读

列表与元组:组织一组数据

掌握有序集合、索引、追加与修改,理解可变列表和不可变元组。

在浏览器中练习 →进度只保存在本机。

学习目标

  • 用列表组织多个值。
  • 追加、读取和修改列表元素。
  • 使用元组表达固定的一组值并进行解包。

概念解释

列表用方括号创建,多个元素用逗号分隔,保留顺序。tasks[0] 读取第一个元素,append 在末尾追加一个元素,tasks[0] = … 修改已有位置。列表是可变对象,修改会改变同一对象的内容。

元组通常用圆括号表示,不能重新赋值其中的元素。它适合表达固定组合,例如一个二维坐标。单元素元组必须有逗号,如 (3,),否则 (3) 只是括号包围的整数。元组可以包含可变对象,因此“元组本身不变”不代表内部所有对象都不可变,本节先使用数字组成的简单元组。

赋值 other = tasks 不复制列表,两个名字引用同一个列表。需要一层独立副本时可使用 tasks.copy();嵌套列表还要考虑更深层的共享。不要把所有修改问题都理解为变量赋值,先判断对象是否可变。

完整代码示例

将下面代码完整复制到运行器,先运行原例,再一次只修改一个地方。

tasks = ["读概念", "运行示例"]
tasks.append("完成练习")
tasks[0] = "复述概念"
print(tasks)
print(len(tasks))
print(tasks[1])
point = (3, 4)
x, y = point
print(x + y)

逐行代码讲解

  1. 第 1 行创建两个字符串组成的列表。
  2. 第 2 行追加第三项,列表长度变为 3。
  3. 第 3 行修改位置 0 的文字。
  4. 第 4 行显示整个列表,包括字符串引号与方括号。
  5. 第 5 行显示元素个数 3,不是所有文字的总长度。
  6. 第 6 行读取第二个元素,因为索引从 0 开始。
  7. 第 7 行创建两个数字组成的元组。
  8. 第 8 行解包:x 取 3,y 取 4,变量个数必须匹配。
  9. 第 9 行相加并输出 7。

实际运行结果

以下输出已在 Python 3 中执行核对。代码和输出分别放在不同区域;不要把输出当作代码。

['复述概念', '运行示例', '完成练习']
3
运行示例
7

常见错误

  • tasks[3] 访问三元素列表会越界,最后一个有效索引是 2。
  • 把 append 返回值赋回 tasks:append 原地修改,返回 None,不要覆盖列表。
  • 试图给 point[0] 赋值会报 TypeError,因为元组不可修改。

实践练习

创建 [60, 80] 的成绩列表,复制一份,在副本后添加 100。确认原列表没有变化;再用 for 遍历副本打印每项成绩。

先独立作答再查看参考。能运行还不够,请解释结果为什么正确。

参考答案

scores = [60, 80]
copy_scores = scores.copy()
copy_scores.append(100)
for score in copy_scores:
    print(score)
assert scores == [60, 80]
assert copy_scores == [60, 80, 100]

输出 60、80、100。两个断言检查是否真的创建了独立的一层副本。

换个角度理解

像一排有编号的座位,编号从 0 开始。a 和 b 可以是同一排座位的两个名字;往这排加一个座位,两边看到的都会改变。

STEP 01名称绑定列表对象
STEP 02下标访问 / 原地修改
STEP 03其他绑定看到同一对象

需要按顺序处理一组数据时,用列表比为每个数据建立单独名字更清晰。明确“修改原对象”和“创建新对象”的区别,可避免共享数据产生意外。

动手观察:一步一步执行

这是当前知识点的独立教学示例,不是本课所有 Python 语法的模拟。修改参数、预测结果,再按下一步验证。完整语言练习使用可信代码运行器。

EXECUTION / 可操作的程序状态

把每一步,看明白

本地受限解释器
参数改变所选示例的数值;执行从头开始。

变量与作用域

输出

每步显示该语句求值后的快照;第 0 步尚未执行。条件行显示判断结果,函数调用单独显示进入与返回。自动播放可随时暂停,默认不会启动。

CHECK YOUR UNDERSTANDING

自己判断,才知道哪里没懂

先选答案再核对。答错会提供原因和补学方向,不影响课程完成进度。

基础 items = [7, 9],items[0] 是?

应用 a = [1];b = a;a.append(2)。b 是?

迁移 a = [1];result = a.append(2)。result 是?

尚未提交练习。知识掌握度和学习进度分别记录。

把你卡住的代码或错误交给理解引擎 →

这一节,你理解到哪里了?

这是你的自我反馈,与练习估计、课程进度分别记录。

本文为TheZ原创教学内容。正文采用 CC BY-NC-SA 4.0,代码采用 MIT 许可。请尊重署名与授权范围。