python 개발을 하다 보면 에러에 Mutable과 Immutable에 대한 에러를 많이 볼 수 있다.
Mutable과 Immutable은 쉽게 말해 변환가능 , 변환불가이다.
변수는 내용을다 변경할 수 있는 거 아닌가? 하는 생각이 처음에 들었었고 해당 내용들이 이해가 잘 가지 않았었다
그러던 도중 깊은 복사와 얕은 복사의 개념을 공부할 때 정확한 내용을 알 수 있었다
Immutable을 아래 예시를 보면서 알아보자
보통 우리는 변수를 선언하고 조회할 때 아래와 같은 방식을 사용한다 아래 내용은 string 변수를 선언한 내용이다
A = "대한민국"
B = A
print(A) #대한민국
print(B) #대한민국
B = "한국"
print(A) #대한민국
print(B) #한국
A변수에 대한민국을 선언 후 A를 B로 복사한 후 B의 내용을 변경했다 그 후 A, B를 조회하면 각각 대한민국과 한국으로 내용이 출력됨을 알 수 있다.
값이 변경이 됐는데 왜 Immutable이지? 라는 생각을 했었다 하지만 일반적인 string, int 등등은 전부 Immutable 이다 ???
A = "대한민국"
A는 "대한민국" 이다가 아니라 A는 "대한민국" 객체인 #001(예시)을 가리키고 있다가 정확한 내용이다.
그 후 B를 선언하면 B는 "대한민국"이라는 내용을 복사한 것이 아닌, #001의 위치를 가리키도록 주소를 복사한 것이다.
그리고 우리가 B의 내용을 "한국"으로 변경하면 #001을 가리키고 있던 주소를 새로운 "한국"이라는 객체 #002를 가리키는 주소로 변경하는 것이다.
여기서 우리는 #001의 내용을 변경할 수 없이 새로운 객체 #002를 만들어 주소만을 변경하는 것이다. 이렇기 때문에 위와 같은 변수들이 Immutable객체인 것이다.
Mutable 객체의 예는 아래 코드를 보자
listA = [1,2,3,4,5]
listB = listA
print(A) # 1,2,3,4,5
print(B) # 1,2,3,4,5
listB.append(6)
print(B) # 1,2,3,4,5,6
print(A) # 1,2,3,4,5,6
위에 예시는 Mutable 객체 중 하나인 list이다. listA를 선언 후 listB로 복사 그리고 B에 내용을 추가하니까 A의 내용도 같이 추가가 된 것을 알 수 있다
listA = [1,2,3,4,5]는 5개의 값을 가지는 list객체의 주소 #003(예시)을 가리키고 있다 이후 listA를 이용해 listB를 복사하면 #003의 주소를 가지는 listB가 만들어진다.
그리고 listB에 내용을 추가, 삭제, 변경을 하게 되면 값을 변경할 수 없었던 Immutable객체와 다르게 #003의 내용을 변경할수 있어서(Mutable) 같은 주소를 바라보고 있는 listA의 내용이 변경된 것처럼 보일 수 있다.
Immutable 객체와 Mutable 객체의 종류는 아래와 같다
자료형 | 구분 |
list | mutable |
set | mutable |
dict | mutable |
bool | immutable |
int | immutable |
float | immutable |
tuple | immutable |
str | immutable |
그렇다면 Immutable과 Mutable을 구분할 줄 알면 나에게 뭐가 좋은 걸까?
필자도 처음에 그렇게 생각했으나 업무를 하면서 해당 내용이 중요하다는 것을 알게 되었는데 그건
깊은 복사와 얕은 복사를 사용할 때 정확하게 차이가 난다 해당내용은 이후 다시 글을 작성하도록 해야겠다.
'IT > python' 카테고리의 다른 글
간단한 python 개발환경 만들기 (0) | 2020.02.04 |
---|