在python中复制复合对象

时间:2012-07-31 12:18:29

标签: python oop reference copying

我有一个由字符串,列表和两个整数组成的复合对象字典。

我循环遍历此字典,执行一些测试,然后基于这些测试将当前测试的对象保存到新字典,然后修改一些属性。到目前为止,这已经在新字典中引用了对象,所以当我更改一些属性时,旧对象也会发生变化,我想避免这种行为。

我尝试使用复制模块中的copy.copycopy.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

1 个答案:

答案 0 :(得分:1)

vpathways[k] = copy.deepcopy(v)

替换之前包含的vpathways[k],因此最多只有.addMutant()可能有效。