사전은 임의의 객체의 집합적 자료형인데, 자료의 순서를 가지지 않는다. 집합적이라는 의에서 리스트나 튜플과 동일하나, 자료의 순서를 정할 수 없는 매핑(Mapping)형이다. 시퀀스 자료형은 자료의 순서를 정할 수 있어서 정수 옵셋에 의한 인덱싱이 가능했지만, 매핑 형에서는 키(Key)를 이용해 값(Value)에 접근한다. 

사전을 출력하면 어떤 순서에 의해서 입력 값들이 표현된다. 그런, 이런 순서는 고정 된 것이 아니라, 입력 값의 종류의 따라서 이러한 순서는 언제든지 바뀔 수 있다. 왜 이런 구조를 사용하느냐 하면, 키에 의한 검색 속도를 빨리하기 위해서이다. 

참고적으로 전문적인 용어로 설명하면 사전은 내부적으로 해쉬(Hash) 라는 기법을 이용하여 자료를 저장한다. 이 해쉬 기법은 자료의 크기가 증가해도 빠른 속도로 자료를 찾을 수 있게 해준다.


※ 사전을 해보니까 C언어에서의 enum 자료형이 생각이 든다. 


값은 임의의 객체가 될 수 있지만, 키는 변경 불가능(Immutable) 자료형이어야 한다. 예를 들어 문자열, 숫자, 튜플,은 키가 될 수 있지만 리스트, 사전은 키가 될 수 없다.




사전 객체의 메쏘드

사전 구조는 시퀀스 형인 리스트나 튜플과는 다르나, 반복적인 혹은 순차적인 처리르 위하여 때로는 이들 자료형으로 변환해야 할 필요가 있다. 이런 경우 사용되는 사전 D에 대한 주요 메쏘드는 다음과 같다.

D.keys()         사전에서 키들을 리스트로 리턴

D.values()         값들을 리스트로 리턴

D.items()         (key, value) 리스트 리턴

key in D         멤버쉽 테스트, D가 key를 가지고 있으면 True



그 외의 메쏘드

D.clear()         사전 D의 모든 아이템 삭제

D.copy()         사전 복사(shallow copy)

D.get(key [, x])         값이 존재하면 D[key], 아니면 x 리턴

D.setdefault(key [, x])         get과 같으나 값이 존재하지 않을 때, 값을 설정(D[key] = x)

D.update(b)         for k in b.keys(): D[k] = b[k]

D.popitem()         (키, 값) 튜플을 리턴하고 사전에서 항목을 제거한다.

D.pop(key)         key 항목의 값을 리턴하고 사전에서 제거한다.




객체의 심볼 테이블

이름 공간(심볼들이 저장되는 공간)을 가지는 모든 객체는 심볼 테이블을 가진다. 어떤 객체의 심볼 테이블을 얻으려면 __dict__ 속성을 이용한다. 

globals()를 사용하면 전역 영역(모듈 영역)의 심볼 테이블(사전)을 얻는다.

locals()를 사용하면 지역 영역의 심볼 테이블을 얻는다.




사전을 for 문으로 참조하기


Posted by scii
: