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。有任何想法吗??

4

3 回答 3

7

for 循环对其表达式求值一次,以获得一个迭代器。稍后,您将名称重新绑定为frontLinks新列表。新列表与 for 循环没有任何关系。

虽然在迭代列表时修改列表很棘手,但可以添加到列表的末尾,它会起作用。将最后一行更改为:

frontLinks.extend(getCurlink)
于 2012-07-10T11:18:57.487 回答
1

迭代列表时,您不会在列表中看到更改。

你需要使用类似的东西:

 while i < len(frontLinks):
     link = frontLinks[i]
     ...
     if condition:
       frontLinks.append(item)
     i += 1
于 2012-07-10T11:17:44.363 回答
1

虽然您可以在迭代时附加到列表,但我会使用一个列表和一个双端队列(您可以使用列表而不是双端队列,只需替换todo.popleft()todo.pop(0)):

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

于 2012-07-10T11:42:45.043 回答