我创建了一个图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'])]
在此之后,我使用相同的提示再次打印,但什么都没有:
[]
我对此非常好奇。我打印出连接的组件一次,似乎它们消失了?!为什么呢?!
答案 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
中,您可以重复使用。