学习指南 →

· Albion Gateway College

Python 专业课:复制列表后,为什么原列表也被改了?

用原创嵌套列表练习追踪引用、浅复制与深复制,学会解释变化原因而不是反复试代码。

先画变量到对象的箭头

执行a=[[1],[2]],b=a,然后b.append([3]),a也会多出[3]。赋值没有复制列表,a和b指向同一个外层对象。先画两个名字连到一个方框,再运行代码验证。

把b=a改成b=a.copy()后,b.append([3])不会改变a的外层长度。但这不表示里面所有对象都已经独立。

浅复制仍共享内部对象

重新开始:a=[[1],[2]];b=a.copy();b[0].append(9)。此时a变成[[1,9],[2]],因为两个外层列表的第一个元素仍引用同一内部列表。

再比较b[0]=[7]:这是让b的第一个槽指向新列表,并非修改原内部列表,因此a的第一个元素不会因这次重新绑定而变化。区分修改对象与重新绑定槽位,是理解结果的关键。

按结构选择复制方式

需要递归复制可复制的嵌套结构时,可研究copy.deepcopy,但不应把它当作所有资源对象的万能方案。对于简单二维数值表,也可按需求逐行复制,并说明结构假设。

自练:先预测再执行a=[[]]*3;a[0].append(1)。三个位置都会显示[1],因为列表重复并未创建三个独立内部列表。改为列表推导式[[] for _ in range(3)],再解释对象数量的区别。

参考资料

下一步

如需大学专业课程或 Tutorial 学习支持,请在咨询中填写模块名称、学习目标和已尝试的步骤。具体教学安排须确认,计分作业由学生独立完成。

继续阅读

学院在线咨询

欢迎咨询

你好,欢迎咨询!你是学生、招生代理、求职者,还是想申请成为导师?请告诉我你的咨询方向。

[email protected]