循环遍历对象列表时,if条件下教师对象未正确添加的问题排查
问题排查与解决方案:教师对象未正确添加到列表的问题
听起来你遇到了一个很有规律的bug——那位能教6节课的老师只在奇数轮次被成功加入列表,偶数轮次失效,这种“奇偶异常”一般都和状态管理的漏洞或者逻辑判断的细节偏差有关,咱们一步步拆解排查:
1. 先确认SubBlock(SB)的状态是否正确重置
你是不是在处理每个SB内的课程时,没有及时重置“上一个Lesson的教师ID”这个状态?比如:
- 第2、4、6次Lesson其实和前一次属于同一个SB,但你误把状态保留成了其他SB的?
- 或者在进入新SB时,没有把
prev_teacher_id重置为None?
最快的验证方式是加调试打印,在每次处理Lesson前输出关键信息:
print(f"当前SB: {lesson.sub_block.id}, 上一教师ID: {prev_teacher_id}, 当前教师ID: {lesson.teacher.id}")
对比打印结果,就能看出第2次处理时,prev_teacher_id是不是和预期一致。
2. 检查教师ID的比较逻辑有没有坑
你用==比较教师ID的时候,有没有可能遇到这些情况:
- ID是字符串类型,但存在大小写不一致(比如"TEACHER001" vs "teacher001")或者隐形空格?
- 你直接比较的是教师对象而非ID,而对象的
__eq__方法没正确实现,导致两个内容相同但内存地址不同的对象被判断为不相等?
建议先强制把ID转成统一格式再比较,比如:
current_teacher_id = str(lesson.teacher.id).strip().lower() prev_teacher_id = str(prev_teacher.id).strip().lower() if prev_teacher else None
3. 排查if条件的隐藏限制
有没有可能你的if语句里除了“ID不匹配”,还加了其他隐形条件?比如:
- 误写了反向逻辑(比如
if prev_teacher_id == current_teacher_id才添加)? - 加了“列表中不存在该教师才添加”的判断,但因为对象实例不同,导致误判?
如果暂时没法贴出完整代码,可以先把条件简化到最基础的版本测试:
if prev_teacher_id is None or current_teacher_id != prev_teacher_id: teachers_list.append(lesson.teacher) prev_teacher_id = current_teacher_id
确认简化后的逻辑是否正常,再逐步加其他判断,定位问题点。
4. 按SB分组后再遍历(推荐)
如果你的遍历是乱序的,没有按SB分组,很容易出现跨SB的状态污染。建议先把所有Lesson按SB分组,再逐个处理每个SB内的课程:
from collections import defaultdict # 先按SB分组课程 sb_lesson_map = defaultdict(list) for lesson in all_lessons: sb_lesson_map[lesson.sub_block].append(lesson) # 逐个处理每个SB的课程 for sb, lessons_in_sb in sb_lesson_map.items(): sb_teachers = [] prev_teacher_id = None for lesson in lessons_in_sb: current_id = lesson.teacher.id if prev_teacher_id is None or current_id != prev_teacher_id: sb_teachers.append(lesson.teacher) prev_teacher_id = current_id # 这里处理当前SB的教师列表
这种方式能彻底避免跨SB的状态干扰,大概率能解决你遇到的奇偶次问题。
内容的提问来源于stack exchange,提问作者pip
相关产品推荐
相关产品推荐

