Immutable과 Mutable(2차원 배열 사용시 주의사항)

이승주·2024년 7월 14일

파이썬 문법 정리

목록 보기
3/10
post-thumbnail

Immutable과 Mutable

수정 불가능한 객체: immutable 객체 ex)int, float, str, tuple
수정 가능한 객체: mutable 객체 ex)list, dict

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

변수 a는 문자열 객체를 바인딩하고 변수 b는 리스트 객체를 바인딩한다
a, b 변수가 바인딩하는 각 객체의 주소를 출력해보면 서로 같음을 확인할 수 있다

Immutable 객체에서의 주소 할당

a = "python2"
id(a) #4399272816
a = "python3"
id(a) #4399272880
  1. 'python2'라는 문자열 객체가 메모리의 4399272816 번지에 할당되고 해당 객체를 a라는 변수가 바인딩
  2. 'python3'라는 문자열 객체가 메모리의 4399272880 번지에 할당되고 해당 객체를 a라는 변수가 바인딩
  3. 'python2'라는 문자열 객체는 가비지 컬렉터에 의해 자동으로 메모리에서 소멸

Mutable 객체에서의 주소 할당

a = ["python2", "python3"]
id(a) #4398197808
a.append("python4")
#a = ['python2', 'python3', 'python4']
id(a) #4398197808
id(a[0]) #4399272816
id(a[1]) #4399272880
id(a[2]) #4399272944

a라는 변수는 리스트 객체를 바인딩중
리스트에 값을 추가해도 리스트 객체의 시작 주소 값은 변하지 않음

Mutable 객체 사용시 주의사항

Mutable 객체는 수정되어도 해당 객체의 주소는 같은 값을 유지한다.

a = [1,2,3]
b = [a, [4,5,6], [7,8,9]]
#b = [[1,2,3], [4,5,6], [7,8,9]]
id(a) #4398197808
a[2] = 10
#b = [[1,2,10], [4,5,6], [7,8,9]]
id(a) #4398197808

a의 주소 값은 리스트 내부 값이 변해도 변하지 않는다.
따라서 a를 요소로 같는 이차원 배열 b는 바꾸지 않아도 a의 내부값이 바뀜에 따라 바뀌게 된다.

profile
개발자 공부

0개의 댓글