在 Python v2.7 中,我在 for 生成器上遇到了一个 for 语句,其中在循环主体中的项目是 for 生成器有副作用:
for ssid in (ssid for ssid in overlaps if ssid != subseq_id):
overlaps = subseq_id_to_overlap_ssids_dict[ssid]
我的问题是重叠的副作用是否应该影响 for 生成器?我希望不是,但如果是这样,那到底是什么意思?如果我处理了第一个匹配元素并现在替换了 overlaps,for 是否会索引到 overlaps 的新值的下一个位置?
请您参考如下方法:
在循环内重新绑定(bind) overlaps 不会对循环产生任何影响(尽管改变它显然会)。在循环中重新绑定(bind) subseq_iq 可能会影响生成器。
for 循环在循环开始时计算表达式以获取迭代器一次:在这种情况下,表达式只是名称 overlaps。一旦它评估了该表达式,它就会从可迭代对象中创建一个迭代器,并使用该迭代器来遍历元素。迭代器取决于表达式返回的对象,它不取决于用于标识该对象的名称(如果确实有任何名称)。
如果是这种特殊情况,代码完全等同于:
for ssid in overlaps:
if ssid != subseq_id:
overlaps = subseq_id_to_overlap_ssids_dict[ssid]
这是一种更清晰的编写方式,但是重新绑定(bind) overlaps 不会改变 for 使用的序列。
