티스토리 뷰

python

Python mutable vs immutable

on1ystar 2019. 3. 12. 22:04
728x90
반응형

본 내용은 재학중인 학교 강의에 개인적인 공부를 더한 흔적입니다. 때문에 제가 조금은 오해한 부분이 있을 수 있습니다. 발견하실 경우 댓글로 남겨주시면 정말 감사하겠습니다 !! ( 책은 점프 투 파이썬&파이썬 for Beginner을 참고했습니다. )


Python의 자료형은 mutable과 immutable 특성이 정해져있다.


이는 값을 변경할 수 있는지의 여부인데, int, str 같은 경우는 immutable로 변수 안에 들어가 있는 값을 변경할 수 없다.

반면에 list는 mutable이기 때문에 변수에 값을 넣고 변경해도 변경 사항이 변수에 그대로 저장된다.

이는 모든 값들이 객체이고 이를 변수가 참조하는 형식이기 때문이다.



실제로 위의 그림처럼 Python은 변수에 '상수 값'을 저장하는 것이 아닌 '주소 값(참조 값)'을 저장하고 있다.

C언어의 경우 y = x 코드는 변수에 각각 42라는 값을 생성해 저장했을 것이다.



Number나 String의 경우 y=x를 했을 때 x가 가리키는 객체를 y도 같이 가리키게 된다.

그런다음 x나 y에 다른 객체를 넣어주면 가리키고 있던 객체가 변경되는 게 아니라 새로운 객체가 생성된 후 그 객체를 가리키게 된다.

반면에 List는 객체 값을 변경해 줘도 변경된 list 객체를 똑같이 가리키고 있다.


이 개념은 Call-by-value , Call-by-reference와 흡사하다.

위의 경우 a 값이 int형 이기 때문에 함수에 인자로 전달되면 a값을 바꾸지 못하고 11이라는 새로운 객체를 만든 후 test()의 a가 이를 가리키게 된다. 따라서 함수 밖의 a는 여전히 1을 가리키고 있으므로 a의 출력 결과는 1이 된다.

아래의 경우는 b가 list형으로 mutable이기 때문에 함수에 b가 인자로 전달되면 a = b가 실행되어 a도 b가 가리키는 객체를 가리키게 되고, a로 추가한 'bear'가 함수 밖을 빠져나와도 b에 그대로 반영된다.

따라서 함수를 만들거나 분석할 때 인자의 자료형을 주의 깊게 봐야 한다.

728x90
반응형

'python' 카테고리의 다른 글

Python argparse 명령행 인자 받기  (0) 2019.03.17
Python List tip, lambda  (0) 2019.03.13
Python Quicksort  (0) 2019.03.08
자료형(1)  (0) 2019.03.06
개발환경 (Python 3.x, visual studio code)  (0) 2019.03.06
댓글