2013-03-01 20 views
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

+3

Ouch。不管它是否有效,我觉得这很丑陋。 – delnan 2013-03-01 14:26:23

回答

3

在循环内部重新绑定overlaps将不会对循环产生任何影响(尽管突变显然会)。重新绑定循环中的subseq_iq可能会影响生成器。

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

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

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

这是写它更明确的方式,但再次重新绑定overlaps不改变正在使用的for序列。

3

for循环通过迭代其参数即在它的参数调用iter以产生迭代器,然后在迭代调用next直到StopIteration升高操作。

在输入for循环之前,您的生成器理解参数会计算名称表达式overlaps,因此重新命名名称overlaps将不起作用;突变overlaps所引用的对象会产生一些效果,具体取决于迭代器如何通过type(overlaps)操作。例如,list上的迭代器将索引增加到列表中。

相关问题