2012-07-10 60 views
0

圈我不知道爲什麼for循環不延長它的迭代:蟒蛇延長

for link in frontLinks: 
     #try:   
     getCurlink = self.getHref(link) # get current site links 
     #print getCurlink 
     #print frontLinks 
     if getCurlink: 
      frontLinks = frontLinks + getCurlink 

這條線:

frontLinks = frontLinks + getCurlink 

並不適用於 「for」 循環的frontLinks。有任何想法嗎??

回答

7

for循環一次評估其表現,獲得一個迭代器。稍後,您將名稱frontLinks重新綁定爲新列表。新列表與for循環無關。

儘管修改列表時很難修改列表,但可以添加到列表的末尾,它可以工作。你的最後一行改成這樣:

frontLinks.extend(getCurlink) 
+1

不應該被追加()嗎? – Dubslow 2012-07-10 11:20:34

+1

這應該是.append()如果getCurlink是一個字符串,例如... – 2012-07-10 11:21:40

+2

我正在使用列表,因此它是擴展。 – badc0re 2012-07-10 11:23:23

1

在迭代它時,您不會在列表中看到更改。

你需要使用類似:

while i < len(frontLinks): 
    link = frontLinks[i] 
    ... 
    if condition: 
     frontLinks.append(item) 
    i += 1 
+2

這不是一個真正的答案*爲什麼*它不工作,雖然... – 2012-07-10 11:18:57

+3

當然,你可以修改列表,而迭代它。 – JBernardo 2012-07-10 11:20:49

1

雖然可以追加到一個列表,而迭代,我會用一個列表和一個雙端隊列(你可以使用一個列表,而不是雙端隊列,只是todo.pop(0)替換todo.popleft()):

from collections import deque 

done = [] 
todo = deque(frontLinks) # your initial frontLinks 
while todo: 
    link = todo.popleft() # take the first element from todo 
    getCurlink = self.getHref(link) # get current site links 
    if getCurlink: 
     todo.extend(getCurlink) # extend the todo list 
    done.append(link) 

這樣,你總是有兩個集合有明確的角色:tododone。您可以停止/恢復迭代,轉儲/加載當前狀態等,而無需重新啓動整個過程。