2012-07-31 2 views
1

문자열,리스트 및 2 개의 int로 구성된 복합 오브젝트 사전이 있습니다.파이썬에서 복합 오브젝트 복사하기

이 사전을 반복하면서 일부 테스트를 수행 한 다음이 테스트를 기반으로 현재 테스트 된 개체를 새 사전에 저장 한 다음 일부 특성을 수정합니다. 지금까지 새로운 사전에 객체에 대한 참조를 넣었으므로 일부 속성을 변경하면 이전 객체도 변경되고이 동작을 피하고 싶습니다.

복사 모듈에서 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 올바른 경로를 포함했고,하지만 각 경로에 대한 돌연변이의 수는 내가 addMutant() 메소드에 인쇄 문을 추가 여전히 0이었고, 그것은 확실히 호출되고 , 돌연변이 속성의 수는 증가하지만 최종 객체에는 증가하지 않습니다.

편집 : 통로 클래스 정의 :

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

복사 된 개체를 어떻게 변경하려고 시도 했습니까? 어떤 오류 메시지가 나타 났습니까? 코드를 보여 주거나 도와 드릴 수 없습니다. – geoffspear

+4

copy() 또는 deepcopy()가 작동하지 않는 예제를 제공합니다. –

+0

죄송합니다. 위에 추가 된 코드 및 설명! –

답변

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

을 대체 vpathways[k]이 최대 하나의 .addMutant()가 작동 할 수 있도록하기 전에 포함 된 뭐든간에.

+0

이제 막 주목했다. 그러나 유감스럽게도'return (vpathways)'이후에도 여전히 0으로 돌아 간다. –

관련 문제