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

时间:2015-09-02 15:23:56

标签: networkx connected-components

我创建了一个图G并添加了两个节点。然后我找到该图的连通分量并将其分配给变量a。

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

然后我打印变量a out:

>> print(list(a))

我得到的结果为:

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

在此之后,我使用相同的提示再次打印,但什么都没有:

[]

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

1 个答案:

答案 0 :(得分:0)

nx.connected_components创建了一个叫做“生成器”的东西。您可以在此处了解有关它们的更多信息:Understanding Generators in Python

最重要的一点是,生成器在你要求它之前不会计算某些东西,并且一旦它计算出来,它就会产生这个东西,然后它就会从内存中消失。例如,如果你这样做

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

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

在您的情况下,您执行了list(a)。这里a是生成器。 list需要a中的所有内容。所以他们都被计算并列入一个列表。现在a中没有任何内容了。它“疲惫不堪”。这是正常的发电机行为。该列表已消失,因为它没有以名称保存。

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

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

此处生成器已耗尽,但其创建的值存储在列表b中,您可以重复使用。