停止值只触发迭代结束,不会作为普通一项进入循环;但为了取得这个停止值,可调用对象的那一次调用已经发生。

适用:本文针对雅安雨城区台式电脑上使用 Python3.14 的场景,说明内置函数 iter 的两参数形式 iter(callable, sentinel)。这里的 callable 是无参可调用对象,sentinel 是停止值。迭代器每次被推进时,先无参调用 callable,再把返回值与 sentinel 作相等比较;不相等才把该返回值作为下一项交给循环;相等则抛出 StopIteration,循环结束。因此,触发停止的那一次返回值不会进入循环变量,也不会成为循环体中的普通一项。问题中最后那个值没有进入循环,是因为它等于 sentinel,被转换成停止信号,而不是先进入循环后被跳过。
观察:第一步,查看 callable 的调用记录;若某次调用返回等于 sentinel,则该次应表现为迭代结束,循环体计数不再增加。第二步,核对循环体计数或输出;核命中停止值以前实际进入的普通项,以及终止调用没有对应循环体项;命中后不会再继续产出后项,不能补造其后的处理记录。第三步,查看副作用记录;若 callable 在返回 sentinel 前已写日志或改计数,这些副作用仍可能发生,因为调用先于比较。第四步,若 sentinel 是自定义对象,观察相等比较是否被调用;若两个不同对象也被判为相等,停止会比按身份判断更早发生。若 callable 每次都返回不等于 sentinel 的值,则这个停止值条件本身没有触发;callable抛异常、外部停止及其他控制流另核,不能承诺无限持续。
风险:把相等比较误当成身份比较,是本题的关键风险。iter(callable, sentinel) 不承诺只有同一个对象出现才停止;只要相等比较成立,就可能停止,所以不同对象也可能触发结束。自定义相等比较若有副作用,比较过程本身也会改动状态。另一个风险是忽略终止调用:callable 在返回 sentinel 的那一次已经被调用,计数、日志或资源状态可能已经变化。若 sentinel 设计得过于宽泛,普通数据可能被提前当成停止信号;若 sentinel 永远不相等,循环又会持续取得非停止值。
下一步:在雅安雨城区台式电脑上整理去敏材料,包括 callable 的无参调用方式、返回值类型、sentinel 的类型与构造方式、是否使用自定义相等比较,以及循环体计数或去敏日志。不要提交客户业务原文;不要推进未知迭代器、不要调用客户构造器、不要申请大内存。需要咨询时,可拨打 400-877-9605;电脑快修网是信息展示与第三方维修对接平台,该号码只作咨询,实际范围和安排需确认。