1. mutable, immutable 객체에 대해서

1.1 mutable , immutable 객체 구분

파이썬에서는 객체의 종류를 두 가지로 구분할 수 있습니다.

변경이 되는 mutable 객체의 종류는 list, set, dictionary 정도가 있고, 변경이 되지 않는 immutable 객체의 종류는 int, float, tuple, str, bool 이 있습니다.

1.2 객체의 상태가 변경된다/안된다. 그래서 뭐 어쩌라고?

사실 파이썬을 그냥 사용하는 입장에서는 생각하지 않아도 되는 부분이긴 합니다만, 다음 포스팅인 얕은 복사, 깊은 복사를 이해하기 위해서는 필요합니다.

파이썬에서는 immutable 객체의 값이 같은 경우에 변수에 상관없이 동일한 곳을 참조합니다. mutable (값이 변경될 수 있는) 객체의 경우에는 모든 객체를 각각 생성해서 참조해 줍니다. 이게 무슨 이야기냐면 id를 이용해서 바로 예제로 보겠습니다.

# immutable 객체 (상태 변경 X)
print("immutable 객체")
a = 99
b = 99
c = 99
d = 99
e = 99

print(hex(id(a)))
print(hex(id(b)))
print(hex(id(c)))
print(hex(id(d)))
print(hex(id(e)))

# mutable 객체 (상태 변경 O)
print("\\nmutable 객체")
arr1 = [1, 2, 3]
arr2 = [1, 2, 3]
arr3 = [1, 2, 3]
arr4 = [1, 2, 3]

print(hex(id(arr1)))
print(hex(id(arr2)))
print(hex(id(arr3)))
print(hex(id(arr4)))

Untitled

- Immutable

변수 a, b, c, d, e 에는 각각 99라는 값이 있습니다. 보통 c, c++에서는 각 변수마다 메모리를 주고, 그 주소값의 값이 달라야 하는데 파이썬에서는 다릅니다. 하나의  immutable 값에 여러 개의 참조가 붙게 됩니다.

그래서 a, b, c, d, e의 주소를 보면 같은 곳을 가리키는 게 보이나요? 99라는 값이 존재하는 메모리 주소를 다 참조하고 있는 것입니다.

immutable 객체들은 값이 바뀌면 참조만 바꾸면 되기 때문에 이런 식으로 설계를 한 것으로 판단됩니다.

- mutable

반대로 arr1, arr2, arr3, arr4 도 모두 같은 값을 집어넣어서 리스트를 생성해보았습니다.

리스트는 mutable (값이 변할 수 있는) 객체입니다.

주소의 결과를 보면 arr1, arr2, arr3, arr4가 참조하는 [1,2,3]이 모두 다른 주소인 것을 알 수 있습니다.

그림을 그려보면 아마 메모리 상에서 이렇게 되어있겠죠?