mutable 자료형과 immutable 자료형 :Python

이민재·2023년 2월 25일
0

Python/Library

목록 보기
2/6

2차원 배열을 활용하는 백준 2563번 색종이 문제를 풀면서, 2차원 리스트를 만들 때 다음과 같은 코드로 만들 경우 요소를 변경할 때 생각지 못한 변화가 발생한다는 것을 발견했다.

arry = [[0] * 100] * 100

반면, 다음의 코드는 정상적으로 이후 요소값의 변경이 생각한대로 이뤄졌다.

arry = [[0]*100 for _ range(100)]

이유는 다름아닌 리스트의 mutable한 속성에 있었다. 전자의 코드는 2중 리스트의 요소로 모조리 같은 리스트 객체를 바라보고 있다. 다시 말해서 arry[0][0], 즉 첫 번째 요소의 첫 번째 요소를 0에서 1로 바꾸면 두 번째, 세 번째 등등 모든 요소들의 첫 번째 요소([arry[i][0]) 값이 모조리 1로 바뀌게 되는 것이다.

그럼 왜 후자의 코드는 바뀌지 않을까?

내가 이해한 바로는 리스트 컴프리헨션을 통해 리스트의 요소로 리스트를 만들면 모두 각각 다른 리스트 객체를 생성해서 그런 것이다. 실제로 다음의 코드를 통해 생성되는 리스트 객체 요소들의 id를 확인해보면 같은 값을 취하고 있음에도 불구하고 모두 독자적인 id를 가지고 있다.

따라서 2중 리스트의 요소인 단일 리스트의 요소를 바꿔도, 전자의 경우처럼 모든 요소값이 바뀌지 않고 해당 단일 리스트의 요소값만이 바뀌는 것이다.

반면에 리스트 컴프리헨션으로 리스트가 아닌 숫자형, 문자열 등을 생성했을 때는 요소의 id가 모두 동일했다. 그러나 이 경우 모두 immutable한 자료형이기 때문에 값을 바꾸면 새로운 메모리 주소가 할당될 것이기 때문에 문제가 발생하지 않는 것이다.

결국 코드 작성 시 오류를 예방하기 위해서는 자료형의 특성이 메모리에 어떻게 구현되는지 파악해야 한다는 점을 알 수 있었다.

profile
넓고 얕은 사람 -> 깊은 사람 -> 깊고 넓은 사람

0개의 댓글