문자열,리스트 및 2 개의 int로 구성된 복합 오브젝트 사전이 있습니다.파이썬에서 복합 오브젝트 복사하기
이 사전을 반복하면서 일부 테스트를 수행 한 다음이 테스트를 기반으로 현재 테스트 된 개체를 새 사전에 저장 한 다음 일부 특성을 수정합니다. 지금까지 새로운 사전에 객체에 대한 참조를 넣었으므로 일부 속성을 변경하면 이전 객체도 변경되고이 동작을 피하고 싶습니다.
복사 모듈에서 copy.copy
및 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 올바른 경로를 포함했고,하지만 각 경로에 대한 돌연변이의 수는 내가 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
복사 된 개체를 어떻게 변경하려고 시도 했습니까? 어떤 오류 메시지가 나타 났습니까? 코드를 보여 주거나 도와 드릴 수 없습니다. – geoffspear
copy() 또는 deepcopy()가 작동하지 않는 예제를 제공합니다. –
죄송합니다. 위에 추가 된 코드 및 설명! –