networkx调用all_node_cuts转list后遍历print无输出原因
现象原因
nx.all_node_cuts(G1)的返回值是一次性生成器(迭代器)对象,不是可以反复遍历的列表、集合类容器,这类对象的特性是仅支持一次完整遍历,遍历到末尾后就会彻底耗尽,无法再产出任何元素。
原代码的执行逻辑:
- 调用接口拿到生成器,赋值给
allNodeCuts - 执行
a = list(allNodeCuts)时,Python会自动遍历这个生成器的所有元素,将其转换为列表存入变量a,这一步执行完后,allNodeCuts指向的生成器已经走到迭代末尾,没有剩余元素 - 后续执行
for i in allNodeCuts时,生成器已经耗尽,循环体不会触发,print(i)自然没有任何输出。
如果把a = list(allNodeCuts)移到for循环之后,执行顺序变为: - 拿到生成器后,先执行for循环遍历,此时生成器还未被消耗,可以正常产出所有元素完成打印
- 循环结束后生成器才被耗尽,此时再执行
list(allNodeCuts)只会得到空列表,不会影响前面的循环输出。
问题涉及的代码如下:
import networkx as nx G1 = nx.erdos_renyi_graph(10,0.6) allNodeCuts = nx.all_node_cuts(G1) a = list(allNodeCuts) for i in allNodeCuts: print(i)
补充说明:Python中所有返回生成器的接口都遵循这个规则,比如内置的
map()、filter()、带yield关键字的自定义函数返回值,都只能完整遍历一次。如果需要多次使用遍历结果,要在第一次遍历的时候就把结果存到列表等可重复访问的容器中。
内容的提问来源于stack exchange,提问作者Nazhir
相关产品推荐
相关产品推荐

