用于循环扩展的python



我想知道为什么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。有什么想法吗??

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

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

frontLinks.extend(getCurlink)

在列表上迭代时不会看到列表中的更改。

你需要使用类似的东西:

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

尽管您可以在迭代时附加到列表,但我会使用一个列表和一个deque(您可以使用列表而不是deque,只需将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。您可以停止/恢复迭代、转储/加载当前状态等,而无需重新启动整个过程。

最新更新