zip 的静默截断:数据配对时把长度当作约束
两列数据分别保存姓名和分数,zip 默认按较短的一列结束。尾部遗漏不会报错,因此一次字段缺失可能变成看似合法但不完整的结果。
▶ 本文含视频讲解▶ 教学视频手动播放 · 英语讲解
Python Tutorial for Beginners
Python 入门课程作为语法与编程背景复习;本文使用的较新标准库特性不保证在该课程中逐项覆盖。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。
播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。
问题从哪里出现
两列数据分别保存姓名和分数,zip 默认按较短的一列结束。尾部遗漏不会报错,因此一次字段缺失可能变成看似合法但不完整的结果。
理解核心机制
Python 3.10 起可用 zip(..., strict=True) 要求输入同时结束。zip 是惰性的,长度错误在迭代抵达不匹配位置时才抛出,不是在创建对象时发现。
动手做一个小实验
Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。
names = ["Ada", "Bo"]
scores = [90, 80]
print(dict(zip(names, scores, strict=True)))
try:
list(zip(names, [90], strict=True))
except ValueError:
print("length mismatch detected")适用边界与常见误区
在出现异常之前,前面的配对可能已被消费。若循环中有数据库写入等副作用,需要先校验完整输入或使用事务,不能把 strict 当作原子性保障。
继续练习
给循环增加已处理计数,再制造最后一个元素缺失,确认异常发生前有多少条数据已处理。