IT/python

Python Mutable과 Immutable 객체

할일없는라이프 2023. 8. 10. 23:07

 

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