Mutable과 Immutable

떵떵·2022년 4월 14일
0

출처 - wikidocs 레벨업 파이썬

리스트를 그림으로 표현

a = "hello"
b = ["hello","python"]

a는 문자열 객체를 바인딩 한다.
b는 리스트 객체를 바인딩 한다.
a와 b가 바인딩하는 각 객체의 주소를 출력해보면 서로 다름을 알 수 있다.

# 변수 a
>>> 2074836971056
# 변수 b
>>> 2074834186368

서로가 다른건 알겠다. 그렇다면 변수 a가 바인딩하는 "hello" 문자열 객체와 b 리스트의 [0]이 바인딩 하는 문자열 "hello"가 동일한 객체일까???

id(a)
>>> 2074836971056
id(b[0])
>>> 2074836971056
id(b)
>>> 2074834186368
id(b[1])
>>> 2074836971440

위의 결과를 보면 a 와 b[0]가 동일한 객체임을 알 수 있고 리스트 b와 b[1]이 서로 다른 객체임을 알 수 있다.

변수와 객체들간의 관계를 위의 이미지로 나타낼 수 있다.

Immutable과 Mutable

파이썬에서는 객체 중 수정 가능한 타입이 있고 수정 불가능한 타입도 있다. 수정 불가능한 객체를 Immutable 객체, 수정 가능한 객체를 Mutable 객체라고 부르며

Immutable객체: int, float, str, tuple

Mutable객체: list, dict

먼저 다음 코드를 실행해보고 메모리 상의 변화를 알아보자

a = "python2"
id(a)
>>> 2074836971632
a = "python3"
id(a)
>>> 2074836971888

위 코드는 다음과 같이 순차적으로 수행한다.

1) 'python2' 문자열 객체가 메모리의 2074836971632 번지에 할당되고 해당 객체를 a라는 변수가 바인딩 함
2) 'python3' 문자열 객체가 메모리의 2074836971888 번지에 할당되고
해당 객체를 a라는 변수가 바인딩 함
3) 'python2' 라는 문자열 객체는 아무도 자신을 참조하지 않기 때문에 가비지 컬렉터에 의해 자동으로 메모리에서 소멸 됨

이렇게 되는 이유로는 문자열 객체는 수정 불가능하기 때문에 'python2'에서 'python3'라는 문자열로 수정된게 아니라 완전히 새로운 객체가 할당 된 것이다. 'python2'를 바인딩하던 a가 'python3'을 바인딩 함으로써 'python2'를 바인딩하는 변수가 없기 때문에 레퍼런스 카운트가 0이 되고 할당이 해제 된 것이다

이번엔 리스트에 대해 수정을 해보겠다. a라는 변수는 리스트 객체를 바인딩 한다. 리스트에 값을 추가해도 리스트 객체의 시작 주소 값은 변하지 않음을 알 수 있다.

a = ['python2','python3']
id(a)
>>> 2074834190080
a.append('python4')
id(a)
>>> 2074834190080

id(a[0])
>>> 2074836971632
id(a[1])
>>> 2074836972208
id(a[2])
>>> 2074836972400

리스트 객체는 [0]번, [1]번, [2]번이 리스트의 원소인 문자열 객체를 다시 바인딩하는 구조로 갖는다. 따라서 리스트에 원소를 추가하거나 삭제해도 리스트 객체의 시작 주소는 변하지 않는 것이다.

0개의 댓글