자료구조 알고리즘/알고리즘

[TIL] 파이썬 객체와 변수 / mutable, immutable 자료형

Campkim 2021. 8. 21. 19:18

객체와 변수

파이썬에서는 데이터, 함수, 모듈, 클래스 모두 객체(object)로 취급한다. 객체는 자료형(data type)을 갖으며, 메모리공간을 차지한다.

파이썬의 변수는 값을 갖지 않는다는 특징이 있다. 변수는 객체가 아니고, 객체에 연결된 이름에 불과하다.

다른 프로그래밍 언어의 경우, 변수란 값을 저장하는 상자와 같다고 비유한다고 하지만, 파이썬에서는 맞는 비유가 아니다.

 

파이썬에서 변수는 객체를 참조하는 객체에 연결된 이름에 불과하다 ?

모든 객체는 메모리를 차지하고, 자료형 뿐만아니라 식별번호(id)를 갖는다. 식변번호는 다른객체와 구별할 수 있는, 객체 고유의 번호이다. 객체가 저장된 메모리의 주소라고 이해하는 것이 맞는 것 같다. 하기 이미지를 참고하면 이해에 도움이 된다.

위 실행문을 보면 n, 17, 5+12 의 식별번호가 모두 동일함을 알 수 있다. 이를 통해 알 수 있는 것은 n = 17은 17이라는 값을 복사하여 대입한 것이 아니고, 17이라는 int형 객체를 참조하는 n이라는 이름을 결합시킨 것으로 이해할 수 있다.

 

메모리 관점에서 다시 설명하면 17이라는 객체는 메모리 어딘가에 저장되어있고, n이라는 변수는 17이라는 객체가 저장된 '주솟값'을 가리킨다. 

 

다시말하면, 파이썬에서 변수는 값이 저장되는 상자가 아닌, 특정 객체를 가리키는 이름에 불과하다. 만일 n의 값이 17이 아닌 다른 값으로 갱신되면, 새로운 값을 갖는 객체가 생성되고, 그 값을 n이 참조하는 것이다.

 

Mutable, Immutable 자료형 

Mutable 자료형에는 list, dictionary등이 있고, Immutable 자료형에는 str, int, tuple등이 있다.

위의 예시에서 변수에 int값을 변경하면 새로운 id(식별번호, 메모리 주소)가 할당됨을 확인할 수 있었다. 

이는 변수에 새로운 값을 대입하면, 값이 아니라 변수가 가르키는 id값이 바뀌는 것으로 이해할 수 있었다. str, tuple과 같은 자료구조도 동일하다. 다만, list와 같은 mutable 자료형은 이야기가 다르다. 하기 이미지를 참고해보자.

최초에 A에 [1,2,3,4] 라는 값을 부여 후, 5라는 요소를 추가했음에도 id값이 변경되지 않음을 확인할 수 있다. 이는 list가 mutable자료형 이기 때문에 가능하다. 다만, A를 새로 선언한다면, 동일한 요소를 갖고 있음에도 새로운 id값이 부여됨을 알 수 있다.

이 부분에 관련된 용어로 등가성과 동일성이라는 용어가 있음을 책에서 확인했다.

등가성은 값만 같음을 의미하고 '=='기호로 확인할 수 있다. 동일성은 값과 id모두 같음을 의미한다. 'is'라는 기호로 확인한다.