私はあなたが何を得ているのか分かりました。ここに簡単な例があります:
class Graph:
def __init__(self, nodes):
self.nodes = list(nodes)
self.nodegen = self.iternodes()
def iternodes(self):
for node in self.nodes:
yield node
def copy(self):
return Graph(self.nodes)
G = Graph([1, 2, 3, 4])
print G.nodegen.next()
H = G.copy()
print H.nodegen.next()
print G.nodegen.next()
もちろんこれは1 1 2
と印刷されます。ただし、H.nodegen.next()
印刷物への呼び出し2.簡単な方法は、それらを同じオブジェクトにするためにあるようにH.nodegen
がG.nodegen
の状態を覚えておきたい:
class Graph:
def __init__(self, nodes, nodegen=None):
self.nodes = list(nodes)
self.nodegen = self.iternodes() if nodegen is None else nodegen
def iternodes(self):
for node in self.nodes:
yield node
def copy(self):
return Graph(self.nodes, self.nodegen)
H.nodegen.next()
を呼び出すとG.nodegen
を進めていきますので、これは、1 2 3
を印刷します同じように。それはあなたが望むものではない場合、このように、内部カウンタを維持するために私には罰金だ:
class Graph:
def __init__(self, nodes, jnode=0):
self.nodes = list(nodes)
self.nodegen = self.iternodes()
self.jnode = jnode
def iternodes(self):
while self.jnode < len(self.nodes):
self.jnode += 1
yield self.nodes[self.jnode-1]
def copy(self):
return Graph(self.nodes, self.jnode)
これは私が何をしたいです疑う1 2 2
を、印刷します。もちろん、self.nodes
を変更したときにイテレータを無効にするなどの処理方法を変更する必要がありますが、それはかなり簡単だと思います。
私たちにいくつかの(擬似)コードを見せてください、これは抽象的すぎます(私にとっては少なくとも)。 – orlp
ジェネレータは簡単にコピーできません。だからこの質問は私にとっては意味がない。あなたは何をしようとしているのですか? –
私はまた質問が意味をなさないとは思わない。すべてをコピーしたい場合は、ディープコピーを使用してください。すべてをコピーする必要がない場合は、コピーする必要がないことを伝えます。 – rafalotufo