변경 가능성 (python에서 정말 중요하다고 생각하는 개념)
Programming/Python 2012. 11. 25. 18:57 |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++의 포인터와 참조자의 개념과 정말 똑같다. 이름(변수)를 포인터 혹은 참조자라고 인식하면 될 것 같다.
'Programming > Python' 카테고리의 다른 글
메모리 관리(쓰레기 수집) // 객체의 신원 식별 (0) | 2012.11.25 |
---|---|
파이썬의 객체 자료형 (0) | 2012.11.25 |
리스트, 튜플, 사전 (0) | 2012.11.25 |
인덱싱(Indexing) & 슬라이싱(Slicing) (0) | 2012.11.25 |
자료형의 종류 (0) | 2012.11.25 |