我想知道为什么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。任何想法??
答案 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)
通过这种方式,您始终拥有两个具有明确角色的集合:todo
和done
。您可以停止/恢复迭代,转储/加载当前状态等,而无需重新启动整个过程。