用于循环扩展的python

时间:2012-07-10 11:16:13

标签: 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。任何想法??

3 个答案:

答案 0 :(得分:7)

for循环计算一次表达式,得到一个迭代器。稍后,您将名称frontLinks重新绑定为新列表。新列表与for循环没有任何关系。

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

frontLinks.extend(getCurlink)

答案 1 :(得分:1)

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

您需要使用以下内容:

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

答案 2 :(得分:1)

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