原地修改与重新绑定的追踪
独立掌握检查 — 评估作业期间不得使用 AI 辅助。如接受任何辅助必须如实申报,但接受辅助的作业只计为补救练习:在声称掌握之前,必须完成一次新的无辅助检查。
前置要求
已完成 Day 04 的值与绑定检查;能够保存一个简短的 Python 文件并在终端中运行。
学习目标
通过预测、运行和解释,说明为什么 append 会改变两个名字共享的列表,而 a = a + [2] 只重新绑定名字 a。
操作指引
必做:
1. 运行任何代码之前,先在草稿区写下你对两行输出的预测。
2. 将练习中的程序保存为 trace.py,然后运行 python trace.py。
3. 把实际输出原样抄在预测旁边,并标出每一处不一致。
4. 针对每种情况,用一两句话说明在该情况第三行之后 a 和 b 分别指向哪个列表对象。
选做(仅在必做证据完成之后):在每种情况之后加上 print(id(a), id(b)),确认两个 id 只在情况 1 中相同。
自主演练与记录
先预测输出,然后运行:
a = [1]
b = a
a.append(2)
print("case 1:", a, b, a is b)
a = [1]
b = a
a = a + [2]
print("case 2:", a, b, a is b)
为什么 b 在情况 1 中改变了,在情况 2 中却没有?
a.append(2) 修改的是两个名字共同指向的那个列表对象。a + [2] 会构造一个全新的列表,而 a = ... 只把名字 a 指向它;b 仍然指向旧列表。
输出(Python 3.13 与 3.14 完全相同):
case 1: [1, 2] [1, 2] True
case 2: [1, 2] [1] False
解析:
- 情况 1:b = a 让两个名字指向同一个列表。append 原地修改这个列表,所以两个名字都显示 [1, 2],a is b 为 True。
- 情况 2:a + [2] 创建了新列表 [1, 2],赋值把 a 重新绑定到它。b 仍指向原来的 [1],所以 a is b 为 False。
规律:原地修改改变的是对象本身,所有指向它的名字都能看到变化;重新绑定只改变某一个名字指向哪个对象,其他名字不受影响。
客观知识测验与诊断追踪
请回答以下题目检验掌握情况。提交前请诚实声明你的辅助条件。
依次运行 a = [1]、b = a、a = a + [2] 之后,print(b) 显示什么?
a + [2] 返回一个新列表,赋值只把 a 指向它。b 仍指向原列表 [1]。只有像 append 这样的原地操作,才会通过 b 看到变化。
想一想第三行是在修改已有对象,还是在创建新对象。
作答应证与历史记录
在没有 AI 辅助的情况下,记录了运行前的预测、两行准确的输出,以及能区分修改共享对象(情况 1)与把一个名字重新绑定到新对象(情况 2)的正确解释。
权威源资源与权利证明
Python Standard Library: Built-in Types
对应章节 / 时间戳: 相关章节:真值检验、比较、可变序列类型
验证版本与日期: Python 3.12 documentation (verified 2026-10-30)
用于核对真值检验、比较、绑定与原地修改行为的规范性参考。
Day 03 补救练习
运行所附 Python 示例,并查阅本机已安装解释器的帮助。
对比候选资源与选型分析 (2)
该参考深入讲解对象语义,超出了表达式练习所需的深度;选择 stdtypes 可将范围限定在运算符层面的内容。
这是对相同运算符的叙述性入门讲解;选择库参考作为正式规范的依据。
Git User Manual: Recording Changes
对应章节 / 时间戳: “记录对仓库的修改”一节
验证版本与日期: Verified 2026-10-30
安全提交前检查小范围差异的一手参考。
Git 基础知识
在本机使用 `git diff` 与 `git status`;理解差异之前不要提交。
对比候选资源与选型分析 (2)
这是命令选项级别的参考;选择 Pro Git 章节,是因为它逐步引导读者在提交前检查修改。
这是易读的商业教程;针对同样的修改检查习惯,书籍章节更深入地解释了暂存与索引语义。