2011-06-18 3 views
1

をコピー発電方法、deepcopyと私はカスタムクラス(グラフクラス)でdeepcopyの使用を避けるためにしようとしています

グラフは、などの頂点、エッジ、などいくつかの属性、およびいくつかの発電方法を(持っています方法はyieldである)。

私はグラフをコピーする必要があります。 H = deepcopy(G)ですが、プログラムを高速化するためにdeepcopyを使用していません。

その後:私はdeepcopyを使用しない場合

  • その後、新しいグラフH で 発電方法は、グラフGで 発電方法の現在の状態を得ることはありません。

  • 私は発電方法と完全なリストジェネレータを使用するための OPTを使用しない場合は、 その後、私は便利な何もしない計算時間 を無駄にします。

解決策はいくつかの特定のジェネレータメソッドを試みることでしたが、エラーが発生しました。

このジェネレータは、 Gの頂点および辺を有し、次にHにディープコピーされた場合、Hのジェネレータは、依然としてGの属性を参照しています(これは論理的です)。

私はdeepcopyの後にジェネレータメソッドを使用するかどうかを決めたのですか?

3つ目のパイソン様式はありますか?

+0

私たちにいくつかの(擬似)コードを見せてください、これは抽象的すぎます(私にとっては少なくとも)。 – orlp

+6

ジェネレータは簡単にコピーできません。だからこの質問は私にとっては意味がない。あなたは何をしようとしているのですか? –

+1

私はまた質問が意味をなさないとは思わない。すべてをコピーしたい場合は、ディープコピーを使用してください。すべてをコピーする必要がない場合は、コピーする必要がないことを伝えます。 – rafalotufo

答えて

2

私はあなたが何を得ているのか分かりました。ここに簡単な例があります:

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.nodegenG.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を変更したときにイテレータを無効にするなどの処理方法を変更する必要がありますが、それはかなり簡単だと思います。

+0

こんにちは@Cosmologicon、はいこれは質問の感覚です。私の解決策は、頂点を削除してグラフHにエッジを追加するので、問題の原因となるイテレータを無効にすることです。グラフの三角形やその他の特殊なサブグラフを反復するなど、より複雑なイテレータを使用し、イテレータ凍結された辺である。ですから、イテレータが頂点や端を参照し続けると、私は問題になります。 –

+0

どのようにしてそのような発電機の方法を再調整するか無効にすることができますか? –

+0

イテレータは単独で無効になります。それはもう使用してはならないことを意味します。問題は、これをどのように検出し、それを使用しないように適切な措置を取るかです。それは、最初のケースでどのように使用しているかに完全に依存します。この時点で、私はあなたがいくつかのコードを投稿すべきことに同意します。 – Cosmologicon

関連する問題