我想知道为什么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)
这样,您总是有两个具有明确角色的集合:todo
和done
。您可以停止/恢复迭代、转储/加载当前状态等,而无需重新启动整个过程。