2012-07-10 150 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。您可以停止/恢复迭代,转储/加载当前状态等,而无需重新启动整个过程。