2013-03-01 24 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上的迭代器將索引增加到列表中。

相關問題