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
中,你可以重复使用。
我创建了一个图 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
中,你可以重复使用。