2010-03-12 6 views
0

임 새 두 파이썬과 사전의 사전을 키우려고. 나는 PHP와 perl에서 이것을했지만 파이썬은 매우 다르게 행동한다. 확실히 파이썬에 익숙한 사람들에게는 이해가됩니다. 여기 내 코드입니다 :파이썬에서 홀수 중첩 사전 동작

colnames = ['name','dob','id']; 
tablehashcopy = {}; 
tablehashcopy = dict.fromkeys(colnames,{}); 

tablehashcopy['name']['hi'] = 0; 
print(tablehashcopy); 

출력 : 문제는 마지막 문 2에서 발생

{'dob': {'hi': 0}, 'name': {'hi': 0}, 'id': {'hi': 0}} 

(나는 편의를 위해에 프린트를 넣어). 나는 한 요소가 'hi'키와 0 키를 가진 'name'사전에 추가되었다는 것을 알았습니다. 그러나이 키, 값 쌍은 모든 하위 사전에 추가되었습니다. 왜?

나는 이것을 우분투 컴퓨터에서 파이썬 2.6과 파이썬 3.1 모두에서 테스트했다.

답변

3

문제는 사용자의 통화와 관련이 있습니다. 빈 사전을 건네주고 모든 키의 값과 똑같은 빈 사전을 사용했습니다. 정확한 사전이 값으로 사용되기 때문에 요소를 추가하면 모든 키의 사전에 대해 동일한 요소가 표시됩니다.

1

dict.fromkeys (seq, [value]) - 값은 아무 것도 전달되지 않지만 기본적으로 dict을 전달한 이후로 각 키 - 값 쌍에 사용됩니다.

2

msalib에 따르면 귀하의 문제는 dict.fromkeys가 사전의 모든 항목을 동일한 개체를 가리킨다는 것입니다. 각 키에 대해 별도의 빈 사전을 만드는 대신을 시도해보십시오

tablehashcopy=dict((key,{}) for key in colnames) 
+0

+1 '{} .fromkeys'에 대한 깨끗한 대안 – tgray

1

을 소스에서, 단 하나의 내부 사전 객체 생성 및 3 번 사용된다. 그래서 당신이 그것을 수정하면 모든 것이 같은 변수에 묶여 있기 때문에 변경 사항을 3 번 보게 될 것입니다.

다음과 같은 방법으로 문제를 해결할 수 있습니다. 이것은 몇 (key, {}) 튜플을 작성하고 사전 생성을 사용합니다 :

colnames = ['name','dob','id'] 
tablehashcopy = dict((k, {}) for k in colnames) 
tablehashcopy['name']['hi'] = 0 
print tablehashcopy # use "print(tablehashcopy)" in Python 3 
# output: {'dob': {}, 'name': {'hi': 0}, 'id': {}} 

또한 형식 (NO 세미콜론) 그들이 필요했기 때문에 내가 삭제 한 몇몇의 문장을 살펴주십시오.

관련 문제