Networkx 中的连接组件在打印后消失了吗?

Connected components in Networkx disappeared after printing?

我创建了一个图 G 并添加了两个节点。然后我找到这个图的连接组件并将它分配给变量 a.

import networkx as nx
G = nx.Graph()
G.add_node('a')
G.add_node('b')
a = nx.connected_components(G)

然后我把变量a打印出来:

>> print(list(a))

我得到的结果是:

[set(['a']), set(['b'])]

在此之后,我使用相同的提示再次打印 a,但什么也没得到:

[]

我对此很好奇。我打印了一次连接的组件,它们似乎消失了?!为什么?!

nx.connected_components 创建了一个叫做 "generator" 的东西。您可以在此处了解更多信息:Understanding Generators in Python

重要的一点是,生成器只有在您提出要求时才会计算,一旦计算出来,它就会生成该东西,然后它就会从内存中消失。例如,如果你这样做

for component in nx.connected_components(G):
     action(component)

它将在 G 中找到一个组件,然后代码将移动到正在执行的任何操作。它找到的第一个组件存储在 component 中,生成器本身不再记住它。动作完成后,循环的下一步开始,生成器将进行所有计算以找到下一个组件。这对于保留内存非常有用,并且可以防止 python 花费大量时间来计算东西 --- 如果您可能提前离开循环,它就不必计算后面的组件。

在你的情况下,你做到了 list(a)。这里 a 是生成器。 list 需要 a 中的所有东西。所以他们都被计算并放入列表中。 a 现在什么都没有了。是"exhausted"。这是正常的生成器行为。该列表已消失,因为它没有用名称保存。

对于我认为你想要的,你应该说:

import networkx as nx
G = nx.Graph()
G.add_node('a')
G.add_node('b')
b = list(nx.connected_components(G))

这里生成器已经用完了,但是它创建的值存储在列表b中,你可以重复使用。