1

文字列、リスト、および 2 つの int で構成される複合オブジェクトの辞書があります。

このディクショナリをループしていくつかのテストを実行し、これらのテストに基づいて、現在テストされているオブジェクトを新しいディクショナリに保存し、いくつかの属性を変更しています。これまでのところ、オブジェクトへの参照が新しいディクショナリに配置されているため、一部の属性を変更すると、古いオブジェクトも変更され、この動作を回避したいと考えています。

copy.copycopy モジュールのandメソッドを使ってみたのcopy.deepcopyですが、なぜかコピー後に属性を変更できませんでした。それらは元の状態のままです。

私は OOP にはかなり慣れていないので、バカレベルの提案を目指してください。

したがって、以下のコードでpathwaysは、 は経路オブジェクトの辞書であり、variants単なるリストです。 names()およびaddMutant()は、経路オブジェクトに属するメソッドです。

役立つ場合: 経路オブジェクトは、その経路に属する遺伝子 (これも別のオブジェクト) のリストを保持します。バリアントのリスト (遺伝子名のリスト) でどの経路が表されているかを調べ、各経路の変異遺伝子の数を記録するように変更された経路の新しい (より小さい) 辞書を返します。このaddMutant()メソッドは、経路オブジェクトに属する int 属性を単純にインクリメントします。

def method(variants, pathways):
    vpathways = {}
            check = 0
            for var in variants:
                for k,v in pathways.iteritems():
                    if(var in v.names()):
                        check +=1
                        vpathways[k] = copy.deepcopy(v)
                        vpathways[k].addMutant()
     return(vpathways)

これを行ったとき、vpathways には正しいパスウェイが含まれていましたが、各パスウェイのミューテーションの数はまだ 0 のままでした。addMutant() メソッドに print ステートメントを追加したところ、確実に呼び出されており、ミューテーション属性の数は増加しますが、最終オブジェクトにはありません。

編集:経路クラスの定義:

class Pathway():
    def __init__(self, pid = None, genes = [],nmut = 0 ):
        self.pid = pid
        self.genes = genes
        self.length = 0
        self.nmut = nmut
        for g in self.genes:
            self.length += g.seqlen
    def __str__(self):
        return('{0} pathway containing {1} genes, with a total sequence length of {2} and {3} mutations'.format(self.pid, len(self.genes), self.length, self.nmut))
    def __repr__(self):
        return self.__str__()   
    def addGene2Pathway(self,g):
        self.genes.append(g)
        self.length += g.seqlen
    def addMutant(self):
        self.nmut +=1  
    def names(self):
        l = []
        for g in self.genes:
            l.append(g.entrezid)
        return l
4

1 に答える 1

1
vpathways[k] = copy.deepcopy(v)

以前に含まれていたものを置き換えるvpathways[k]ため、せいぜい1つ.addMutant()が機能する可能性があります。

于 2012-07-31T12:44:16.753 に答える