nx.connected_components
「ジェネレーター」と呼ばれるものを作成します。それらの詳細については、こちらを参照してください: Python でのジェネレーターの理解
大きなポイントは、ジェネレーターは、ユーザーが要求するまで何かを計算しません。一度計算すると、それが生成され、メモリから消えてしまうということです。たとえば、
for component in nx.connected_components(G):
action(component)
で 1 つのコンポーネントが検出され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))
ここでジェネレーターは使い果たされていますが、生成された値は listb
に格納されており、繰り返し使用できます。