파이썬의 변수 타입은 불변형(immutable) 객체와, 가변형(mutable) 객체가 있습니다. 이 타입에 따라 값의 수정이 허용(mutable)되기도 하고 허용되지 않기(immutable)도 하는데요.
immutable 객체의 대표적인 예시는 숫자, 문자열, tuple 등이 있습니다.
mutable 객체의 대표적인 예시는 list, dictionary, set 등입니다.
예를 들어 아래와 같은 코드가 있다고 하면,
x = 5 # 정수는 immutable 객체
x = 10 # 실제로는 x의 값이 변경된 것이 아니라, 새로운 값을 가리키도록 x가 다시 할당된 것임
x는 immutable 객체인 '5'를 가리키고 있었습니다. 만약 다시 x=10으로 정의한다고 해도 이 '5'라는 immutable 객체가 수정되지는 않습니다. 그냥 새로운 immutable 객체인 '10'을 가리키게 되는 것입니다.
그렇지만 리스트의 경우에는
my_list = [1, 2, 3] # 리스트는 mutable 객체
my_list[0] = 10 # 리스트의 첫 번째 요소를 10으로 변경
실제로 my_list라는 list가 수정됩니다.
이 mutable/immutable의 차이가 극명하게 드러나는 예시를 한번 볼까요?
a = 1 # 정수는 immutable
b = a # b는 a의 값을 복사 (1을 가리킴)
a = 3 # a에 새로운 값을 할당
print(a) # 출력: 3
print(b) # 출력: 1
a = [1, 2, 3] # 리스트는 mutable
b = a # b는 a가 가리키는 동일한 리스트를 참조
a[0] = 100 # a의 첫 번째 요소를 100으로 변경
print(a) # 출력: [100, 2, 3]
print(b) # 출력: [100, 2, 3]
immutable 예시에서 a에 1이 할당되었을 때 b는 a의 값을 복사해서 1을 가리키게 됩니다. 이후에 a를 3으로 바꿔도, b는 여전히 1을 가리키고 있어서 b의 값은 변경되지 않습니다. 이것이 immutable의 특성입니다. a를 새 값으로 변경하는 순간, 새로운 메모리 공간에 3이 할당되고, b는 이전에 가리키던 1을 그대로 유지하죠.
그런데 mutable 예시에서는 어떨까요? a와 b는 동일한 리스트를 가리키고 있기 때문에, a의 값을 변경하면 b도 같은 리스트를 참조하므로 변경된 값이 그대로 반영됩니다.
우리 게임으로 비유를 하나 해볼까요? warcraft와 같은 전략시뮬레이션 게임을 하다보면 병영에서 유닛을 생산하고 생산된 유닛이 나오자마자 어디로 집결할지 지정합니다. 만약 이 집결지를 맵 위의 어떤 특정한 지형으로 지정해두면, 유닛들은 항상 고정된 자리를 향해 집결하게 됩니다(만약 집결지를 다른곳으로 바꾸고 싶으면 다른 곳으로 지정을 해주면 되겠죠). 그런데, 보통 이렇게 맵 위의 특정 지점을 집결지로 지정하는 것이 아니라 중요 유닛(영웅 a.k.a. Champion)에게 걸어놓을 수도 있습니다. 'Champion이 있는 곳을 향해 이동하라'고 명령해두는 것이죠. 이렇게되면 영웅이 동쪽에 있으면 동쪽으로, 남쪽에 있으면 남쪽으로 이동합니다. 집결지로 전달받은 '영웅의 위치'라는 것이 항상 고정적인 게 아니라 매번 달라지는 것이지요. 전자가 immutable 후자가 mutable에 대응되는 거라고 보시면 될 것 같네요.
요번 Posting은 생각보다 길어졌는데 마치고 다음번에는 이어서 Container에 대해서 업로드 하도록 하겠습니다.
'프로그래밍 > Python 관련 정보' 카테고리의 다른 글
[Python Programming 기초] Iterator (0) | 2024.10.20 |
---|---|
[Python Programming 기초] Container (0) | 2024.10.19 |
[Python Programming 기초] 파이썬 연산자 우선순위 (2) | 2024.10.17 |
Iterator/Generator의 활용 (2) | 2022.05.18 |
[Deep Learning] Progressive Disclosure of Complexity: TF (0) | 2021.11.21 |