迭代器“一旦耗尽不可重用”是协议约定而非物理特性,表现为:next()持续抛StopIteration、iter(it)不重置、多for循环仅首轮有效、与可迭代对象行为对比明显、内部状态不可逆。

看 next() 调用是否持续抛出 StopIteration
这是最直接的识别方式。一个迭代器耗尽后,每次调用 next() 都会立即触发 StopIteration 异常,不再返回任何有效值。
- 哪怕只调用过一次
next()后就停止,再次调用仍会抛异常(不是暂停,是永久失效) - 即使对同一个迭代器对象反复调用
iter(it),也不会重置——因为it本身已是迭代器,iter(it)通常返回它自己
检查是否支持重复 for 循环遍历
把同一个迭代器对象放进多个 for 循环里:
- 第一个循环能正常走完(或部分走完)
- 第二个循环立刻不执行任何迭代体,等价于空操作
- 这说明该对象不具备“可重入性”,本质是一次性数据流
对比可迭代对象(如列表)的行为差异
拿一个列表和它生成的迭代器并列测试:
lst = [1, 2, 3]; it = iter(lst)-
list(it)→[1, 2, 3];再执行list(it)→[](空) - 但
list(lst)每次都返回[1, 2, 3] - 这种“用完即空”的响应模式,就是耗尽不可重用的外在标志
观察内部状态是否不可逆
自定义迭代器中,如果 __next__ 方法内有计数器或游标(如 self.index),耗尽后该状态通常:
- 不会自动归零或重置
- 没有公开的
reset()或rewind()方法 - 重新调用
__iter__()返回的仍是自身(若它把自己当迭代器),不会新建状态

















