1

在 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

4

2 回答 2

3

在循环内重新绑定overlaps不会对循环产生任何影响(尽管改变它显然会)。在循环侧重新绑定 subseq_iq 可能会影响生成器。

循环计算表达式以在for循环开始时获得一个迭代器:在这种情况下,表达式只是 name overlaps。一旦它评估了该表达式,它就会从可迭代对象中创建一个迭代器,并使用该迭代器来处理元素。迭代器取决于表达式返回的对象,它不依赖于用于标识该对象的名称(如果确实有任何名称)。

如果这种特殊情况,代码完全等同于:

for ssid in overlaps:
  if ssid != subseq_id:
     overlaps = subseq_id_to_overlap_ssids_dict[ssid]

这是一种更清晰的编写方式,但再次绑定overlaps不会更改for.

于 2013-03-01T14:26:27.933 回答
3

for循环通过迭代它的参数来操作,即调用它iter的参数来产生一个迭代器,然后调用next迭代器直到StopIteration被引发。

您的生成器理解参数在进入循环overlaps之前评估名称表达式,因此重新绑定名称将无效;改变引用的对象会产生一些影响,这取决于迭代器的过度操作方式。例如,迭代器在列表中增加一个索引。foroverlapsoverlapstype(overlaps)list

于 2013-03-01T14:31:51.433 回答