在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
索引到新值的下一个位置吗?
答案 0 :(得分:3)
在循环内重新绑定overlaps
对循环没有任何影响(尽管显然会改变它)。在循环中重新绑定subseq_iq可能会影响生成器。
for
循环计算表达式以在循环开始时获取迭代器一次:在这种情况下,表达式只是名称overlaps
。一旦它评估了该表达式,它就会从iterable中创建一个迭代器,并使用该迭代器来处理这些元素。迭代器依赖于表达式返回的对象,它不依赖于用于标识该对象的名称(如果确实有任何名称)。
如果这种特殊情况,代码完全等同于:
for ssid in overlaps:
if ssid != subseq_id:
overlaps = subseq_id_to_overlap_ssids_dict[ssid]
这是一种更清晰的编写方式,但重新绑定overlaps
并不会改变for
使用的序列。
答案 1 :(得分:3)
for
循环通过迭代其参数来操作,即在其参数上调用iter
以生成迭代器,然后在迭代器上调用next
,直到StopIteration
被引发。< / p>
您的generator comprehension参数在输入overlaps
循环之前计算名称表达式for
,因此重新绑定名称overlaps
将不起作用;变异overlaps
引用的对象会产生一些影响,具体取决于type(overlaps)
上的迭代器的运行方式。例如,list
上的迭代器将索引增加到列表中。