2009-12-09 10 views
0

신참 경고 :사전 (같은 값, 다른 키)

내가 파이썬에 새로 온 사람과 나는 기본적으로 딕셔너리에 값을 추가 해요 때, 나는 전체 사전을 인쇄하고있을 때, 내가 얻을 것을 발견 특정 키의 모든 키에 대해 동일한 값.

포인터 문제가있는 것 같습니다. 이벤트 기반의 XML 파서 (SAX)를 사용할 때

가 여기에 조각입니다 : "행"의 모든 요소 종료와 기본적으로

을, 나는 그것에 의해 요소를 저장하고있어 열쇠 : 자기가 self.Id는, 요소.

def endElement(self, name): 
    if name == "row": 
    self.mapping[self.Id] = self 
    print "Storing...: " + self.DisplayName + " at Id: " + self.Id 

답변

4

그 유일한 값이 혹시 저장가 이후 당신은 물론 self.mapping에서 모든 단일 항목의 값 self를 얻을 수 있습니다. 차라리 self 또는 그 속성 중 일부의 사본/스냅 샷을 취한 다음 다시 저장하기 전에 self 변경을 했습니까?

편집 :

import copy 

... 

    self.mapping[self.Id] = copy.copy(self) 

또는 copy.deepcopy(self) 경우 self가, 사이의 속성, 사전, 목록 등을 사용하십시오 영업 이익은 참으로 복사를 취할 필요가 않는다 (코멘트) 명확히 것처럼 재귀 적으로 복사해야합니다 (물론 self.mapping이 포함되어 있기 때문에 다소 특이한 결과가 나타납니다. 보통의 얕은 copy.copy이 충분하지 않은 경우 폭발을 피하기 위해 깊은 복사를 사용자 정의하기 위해 자체 클래스에 특별한 방법을 추가 할 가치가 있습니다. 일반적으로 발생하는 사본의 사본 사본 ;-).

+0

저는 색소폰 파서를 사용하기 때문에 요소의 끝에 도달 할 때마다 endElement가 호출됩니다 ... 요소에 ID를 저장하려고합니다. –

+0

알렉스, 감사합니다. 어떻게하면 "참조"대신에 "사본"을 할당 할 수 있습니까? –

+1

'import copy'를 저장하고 목록 (list), dicts (dicts) 등 속성으로 가지고있는 모든 컨테이너의 재귀 적 복사본이 필요한 경우'copy.copy (self)'(또는'copy.deepcopy (self)')를 저장하십시오. –

2

내가하는 말을 이해한다면 이는 아마도 예상되는 동작 일 것입니다. 파이썬에서 과제를 만들 때 참조 (포인터와 비슷한 종류)을 할당하면됩니다. 당신이 할 경우 : self

self.mapping[self.Id] = self 

후 미래의 변화는 방금 한 그 매핑에 대한 값에 반영됩니다. 파이썬은 객체를 "복사"하지 않습니다 (특별히 코드를 작성하지 않는 한), 오직 참조 만 지정합니다.

+0

정확히 내가 생각했던 것, 감사합니다! –

+0

값을 복사하려면 복사 모듈을 체크 아웃하십시오. – zdav