사전은 임의의 객체의 집합적 자료형인데, 자료의 순서를 가지지 않는다. 집합적이라는 의에서 리스트나 튜플과 동일하나, 자료의 순서를 정할 수 없는 매핑(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
:

python 자료형의 분류


 자료형

저장 모델 

변경 가능성 

접근 방법 

수치 형 

리터럴(scalar) 

불가 

직접 

문자열 

리터럴 

불가 

시퀀스 

튜플 

저장 

불가

시퀀스 

리스트 

저장 

가능 

시퀀스 

사전 

저장 

가능 

매핑(mapping) 






















자료형들을 구분하는 또 다른 중요한 구분 기준.

- 자료 값을 변경할 수 있는가? 이다.


변경할 수 있는 자료형을 '변경 가능하다(Mutable)' 고 하고, 그렇지 않은 자료형을 '변경 가능하지 않다(Immutable)' 고 한다. 


변경 가능한 자료형 - 리스트, 사전

변경 가능하지 않은 자료형 - 숫자, 문자열, 튜플




ex) >>> a = 1

>>> a = 2

이렇게 있다고 생각한다면...

결론부터 말해서 a는 숫자 2로 변경된 것이 아니다. 

1은 변경되지 않고 다만 a가 다른 객체(2)를 참조할 뿐이다.

※ python 에서는 객체와 이름은 별도로 관리된다. 이름에 직접 값이 저장되는 것이 아니고, 이름은 언제나 객체를 참조(Referencing) 하게 되어 있다.


a    --->    1    # a=1 한 후

a    --->    2    # a=2 한 후 ( 객체 1은 참조되지 않으므로 버려진다.)


결국, 숫자 객체 1은 값이 변경되지 않았다. 이름 a가 다른 객체를 참조한다. 이때 객체 1은 참조되지 않으므로 메모리에서 제거된다. 

즉, 이름에 의해 참조만 바뀌는 것.


ex) >>> L1 = [1,2]

>>> L2 = [3,4]

이것도 마찬가지로 이름에 의해 참조만 바뀌는 것이다. 

그러나 객체 내부의 값을 변경할 때에, 리스트는 값을 변경할 수 있다.


즉, 어떠한 이름으로 객체 전체를 바꾸는 것은 객체 전체를 변경하는 것이 아니며, 새로운 객체를 할당하는 것이다.


객체 변경의 의미는? 객체 내부의 값을 변경할 수 있는가이다.





python의 이름이라는 것이 c/c++의 포인터와 참조자의 개념과 정말 똑같다. 이름(변수)를 포인터 혹은 참조자라고 인식하면 될 것 같다.

Posted by scii
:

리스트

[]를 사용하는 리스트는 임의의 객체를 저장하는 집합적 자료형이다. 각 자료는 순서를 가지고있고 순서에 따라 접근 가능하다.


리스트는 메쏘드(객체 함수)를 가진다.




튜플

()를 사용하는 튜플도 문자열과 리스트와 유사한 특정을 가진다.


튜플과 리스트의 차이라면, 튜플은 값의 변경이 안 되고, 리스트는 가능하다는 것이다.


또한, 리스트는 다양한 메쏘드를 가지지만, 튜플은 그렇지 않다.




사전

사전은 옵셋이 아닌 키를 사용하여 값을 얻는 자료 구조이다. 이것은 사상 함수와 같은 역할을 한다. 

함수 f는 f:x -> y와 같이 x를 y로 사상시킨다. 사전의 역할이 이와 동잃다. 사전에 x라는 키(key)를 주면 값 y를 돌려준다.

또한 키에 대응하는 값(value)을 저장할 수도 있다.

사전은 초기화할 때 {}를 사용한다. 초기 값은 '키:값' 의 형태로 준다.



Posted by scii
: