2017-04-19 11 views
-2

저는 소프트웨어의 매개 변수 파일을 생성하는 데 사용되는 Python 클래스가 있습니다. 이 소프트웨어는 반복 프로세스에서 사용되며 각 반복마다 새로운 매개 변수 파일 집합이 필요합니다. 이와 같이 클래스 PropGen은 각 반복 직전에 새 파일을 만들기 위해 호출됩니다.복사 방법에 관계없이 클래스 공유 객체 ID에 두 개의 OrdereDict가 포함되어 있습니다.

클래스는 전체 프로세스 전에 한 번 이러한 파일의 기본 매개 변수를 제공하고 현재 반복을 받으면 이러한 매개 변수를 수정하여 새 파일에 씁니다. 이 작업을 수행하는 방법은 OrderedDictself.params에 기본값을 저장하고 파일에 쓰는 데 사용되기 전에 수정 된 값을 수집하는 또 다른 OrderedDictself.output_params을 생성하는 것입니다.

내 문제는 내가 self.paramsself.output_params에 두 사전의 값을 이동하는 방법에 상관없이 동일한 개체 ID를 가지고 있으며, 따라서 self.output_params에 대한 변경이 self.params에 반영되어 있다는 점이다. 지금까지 다음을 시도했습니다 :

EDIT 파일 끝에서 deepcopy에 대한 호출이 누락되었습니다.

class A(object): 
    def __init__(self): 
     self.a = OrderedDict({'a':1, 'b':2}) 
     self.b = deepcopy(self.a) 
     self.iter = 0 

    def do_some_work(self, key): 
     val = self.a[key]   
     self.b[key] = val.replace('#', self.iter) 

    def create(self): 
     lines = [] 
     for item in self.output_params.items(): 
      lines.append('='.join(item) + '\n') 
     with open(filename, 'w') as file_obj: 
      file_obj.writelines(lines) 
     # Here was the error 
     self.b = self.a 
     # should have been self.b = deepcopy(self.a) 
+2

당신은 왜 그들이 같은 객체 ID를 공유한다고 생각합니까? '=='는 객체 동일성을 검사하지 않고 * equality *를 검사합니다. – BrenBarn

+0

i는'id()'로도 확인했습니다 – Grr

+3

다음 실제 문제를 보여주는 자체 예제를 보여주십시오. 게시 된 코드의 아무 것도 실제로 객체가 동일한 ID를 갖고 있다는 것을 보여주지 않으며 예제가 자체 포함되지 않았기 때문에 테스트 할 수 없습니다. – BrenBarn

답변

0

문제는 사용자가 표시하지 않은 것입니다. 따라서 실제로 문제를 보여주는 실행 가능한 예제를 제공하는 데 더 열심히 노력하십시오. 예를 들어, 당신이 실행할 수 있습니다 파이썬 2 또는 3에서 나를 위해

from collections import OrderedDict 

class C: 
    def __init__(self): 
     self.d1 = OrderedDict(a=1, b=2) 

    def copy(self): 
     self.d2 = self.d1.copy() 

c = C() 
c.copy() 
print(c.d1 is c.d2) 
c.d1['a'] = 666 
print(c.d1) 
print(c.d2) 

를, 그것은 인쇄 :

False 
OrderedDict([('a', 666), ('b', 2)]) 
OrderedDict([('a', 1), ('b', 2)]) 

당신을 위해 무엇을 인쇄는 무엇입니까? 그것이 당신을 위해 일한다고 가정하면, 에 코드에 관해 우리를 보여 줬습니까?

+2

응축 된 예를 준비하면서 나는 내 오류를 발견 할 수 있었다. self.b를 원래 상태로 되돌릴 때 나는 deepcopy를 생략했다. – Grr