Udacity课程Quiz21作业疑问:自写代码列表长度输出错误排查
问题:自定义代码生成的列表长度与预期不符(Udacity Quiz 21)
背景
我正在完成Udacity的Quiz 21作业,目标是创建两个独立的学生参与记录列表,但自己编写的代码输出的列表长度始终和预期不符。虽然我能看懂推荐的解决方案,但一直搞不懂自己的代码为什么会出问题——我原本是想让两个列表分别对应不同的学生群体来记录数据的。
我的错误代码
# 我实际写的类似代码例子 base_participants = [] group_first = base_participants group_second = base_participants # 给第一个组添加记录 group_first.append({"student_id": 101, "status": "completed"}) group_first.append({"student_id": 102, "status": "in_progress"}) # 给第二个组添加记录 group_second.append({"student_id": 201, "status": "completed"}) # 输出结果不符合预期:两个列表长度都是3,而我预期group_first是2,group_second是1 print(len(group_first)) # 3 print(len(group_second)) # 3
推荐的解决方案代码
# 正确的实现方式 group_first = [] group_second = [] group_first.append({"student_id": 101, "status": "completed"}) group_first.append({"student_id": 102, "status": "in_progress"}) group_second.append({"student_id": 201, "status": "completed"}) # 输出符合预期:group_first长度2,group_second长度1 print(len(group_first)) # 2 print(len(group_second)) # 1
我的困惑
我理解正确代码是分别创建了两个独立的空列表,但我不明白为什么我用group_first = base_participants这种方式赋值后,两个列表会共享数据?
解答
这是Python里很容易踩的一个坑——列表是可变对象,直接赋值传递的是对象引用,而不是创建新的副本。
当你执行group_first = base_participants和group_second = base_participants时,并没有生成两个新的空列表,而是让group_first和group_second这两个变量,都指向内存中同一个base_participants列表对象。所以不管你通过哪个变量去添加、删除元素,本质上都是在修改同一个列表,最终两个变量的长度当然会完全一样,和你想要的“两个独立列表”的预期不符。
如果你需要基于已有列表创建独立的新列表,可以用这几种方法:
- 使用列表切片:
group_first = base_participants[:] - 使用
list()构造函数:group_first = list(base_participants) - 导入
copy模块做浅拷贝(如果列表里有嵌套的可变对象,比如字典、子列表,可能需要用copy.deepcopy()):import copy group_first = copy.copy(base_participants)
简单来说,你的代码问题核心是把“变量赋值”当成了“对象复制”,导致两个变量共享同一个列表实例,最终输出的长度不符合预期。
内容的提问来源于stack exchange,提问作者Stefan Lavelle
相关产品推荐
相关产品推荐

