Python循环中扩展列表的正确方式?附DAG广度优先遍历场景
遍历列表时动态添加元素的合法性说明
你的这段Python代码是合法且行为明确的,不属于未定义行为。
Python的for循环遍历列表时,是基于列表的迭代器逐个获取元素的。而列表是可变序列,当你在循环过程中向列表末尾添加元素时,迭代器会继续遍历这些新添加的元素,直到列表中没有更多元素为止。比如你给出的代码:
processing_list = [0] for item in processing_list: if item < 10: processing_list.append(item + 1)
它会从0开始,依次把1到10添加进列表,直到取出10时不满足item < 10的条件,循环结束,最终processing_list会变成[0,1,2,...,10],完全符合预期。
回到你的DAG广度优先遍历场景,这种写法是可行的,但有个需要注意的点:如果处理逻辑有疏漏(比如误将带环的结构当作DAG,或者节点判断失误),可能会导致节点被重复添加,进而引发无限循环或重复处理。所以实际做BFS时,通常会额外维护一个已访问集合来规避这个问题,示例如下:
# 假设起始节点是start_node processing_list = [start_node] visited = set(processing_list) for item in processing_list: # 遍历当前节点的所有子节点 for child_node in get_child_nodes(item): if child_node not in visited: visited.add(child_node) processing_list.append(child_node)
内容的提问来源于stack exchange,提问作者user18348324
相关产品推荐
相关产品推荐

