0

I created a graph G and add two nodes. Then I find the connected components of this graph and assign it to variable a.

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

Then I print the variable a out:

>> print(list(a))

and I get the result as:

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

After this, I print a again using the same prompt, but got nothing:

[]

I'm very curious about this. I print the connected components out once, and it seems that they disappeared?! Why?!

4

1 回答 1

0

nx.connected_components创建一个叫做“生成器”的东西。您可以在此处了解有关它们的更多信息:了解 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中,您可以重复使用。

于 2015-09-02T21:16:23.597 回答