WMX · 随记
·Python· 3 分钟阅读

zip 的静默截断:数据配对时把长度当作约束

两列数据分别保存姓名和分数,zip 默认按较短的一列结束。尾部遗漏不会报错,因此一次字段缺失可能变成看似合法但不完整的结果。

▶ 本文含视频讲解
▶ 教学视频手动播放 · 英语讲解

Python Tutorial for Beginners

Python 入门课程作为语法与编程背景复习;本文使用的较新标准库特性不保证在该课程中逐项覆盖。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。

播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。

Python 系列概览:输入校验、数据处理与行为验证
Python 系列概览:输入校验、数据处理与行为验证 点击图片查看大图 ↗

问题从哪里出现

两列数据分别保存姓名和分数,zip 默认按较短的一列结束。尾部遗漏不会报错,因此一次字段缺失可能变成看似合法但不完整的结果。

理解核心机制

Python 3.10 起可用 zip(..., strict=True) 要求输入同时结束。zip 是惰性的,长度错误在迭代抵达不匹配位置时才抛出,不是在创建对象时发现。

动手做一个小实验

Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。

Python7 行 · 可横向滚动
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 当作原子性保障。

继续练习

给循环增加已处理计数,再制造最后一个元素缺失,确认异常发生前有多少条数据已处理。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档