코딩/Python

[Python] Mutable, Immutable한 자료구조에 대해 공부해보자

작은코딩 2022. 6. 9. 17:24

📚 파이썬의 Mutable, Immutable

📒 Mutable

Mutable Definition
Mutable is when something is changeable or has the ability to change. In Python, ‘mutable’ is the ability of objects to change their values. These are often the objects that store a collection of data.

 

Mutable은 무언가가 변경 가능하거나 변경할 수 있는 경우입니다. Python에서 '변경 가능'은 객체가 값을 변경할 수 있는 능력입니다. 이들은 종종 데이터 컬렉션을 저장하는 개체입니다.

 

📑 Mutable 객체 목록

  • list
  • dictionary
  • set

 


📒 Immutable

Immutable Definition
Immutable is the when no change is possible over time. In Python, if the value of an object cannot be changed over time, then it is known as immutable. Once created, the value of these objects is permanent.

 

불변은 시간이 지남에 따라 변경이 불가능할 때입니다. 파이썬에서 객체의 값이 시간이 지남에 따라 변경할 수 없는 경우 이를 불변(immutable)이라고 합니다. 일단 생성되면 이러한 개체의 가치는 영구적입니다.

 

📑 Immutable 객체 목록

  • numbers (int, float, rational, decimal, complex & boolean)
  • str
  • tuple
  • frozen set

 


📒 차이점

Mutable Immutable
객체의 상태는 생성 후 수정할 수 있습니다.  객체의 상태는 일단 생성되면 수정할 수 없습니다.
스레드로부터 안전하지 않습니다.  스레드로부터 안전합니다.

 


📚 Mutable, Immutable 객체 실험

📒 코드

# mutable, immutable 객체 생성

# ★★★ mutable immutable 자료구조 정리 ★★★

immutable_str   = "String is immutable!!"
immutable_int   = 10
immutable_float = 10.0
immutable_tuple = ("Tuple is immutable!!")
immutable_frozenset = frozenset({"Frozenset is immutable!!"})

mutable_list    = ["list is mutable!!"]
mutable_dict    = {"dict": "is mutavle!!"}
mutable_set     = {"set is mutable!!"}

 

# 변수에 객체 저장하기

# mutable, immutable 성격을 가진 객체를 변수에 저장
str_ = immutable_str
int_ = immutable_int
float_ = immutable_float
tuple_ = immutable_tuple
frozenset_ = immutable_frozenset

list_ = mutable_list
dict_ = mutable_dict
set_ = mutable_set

 

# 변수에 data 추가하기

# 변수에 data 추가하기
str_ += " immutable string!!"
int_ += 10
float_ += 10
tuple_ += (" immutable tuple!!")
frozenset_ |= frozenset({"immutable frozenset!!"})


list_.append("mutable list!!")
dict_["add"] = "mutable dict!!"
set_ |= {"mutable set!!"}

 

# 처음 만든 객체와 데이터를 추가한 변수의 좌표값과 데이터 비교하기

# 처음 만든 객체와 데이터를 추가한 변수의 좌표값과 데이터 비교하기
print("★★  immutable ★★")
print(f"hex_id: {hex(id(immutable_str))}        immutable_str: {immutable_str}")
print(f"hex_id: {hex(id(str_))}                 str_: {str_}")
print(f"hex_id: {hex(id(immutable_int))}        immutable_int: {immutable_int}")
print(f"hex_id: {hex(id(int_))}                 int_: {int_}")
print(f"hex_id: {hex(id(immutable_float))}      immutable_float: {immutable_float}")
print(f"hex_id: {hex(id(float_))}               float_: {float_}")
print(f"hex_id: {hex(id(immutable_tuple))}      immutable_tuple: {immutable_tuple}")
print(f"hex_id: {hex(id(tuple_))}               tuple_: {tuple_}")
print(f"hex_id: {hex(id(immutable_frozenset))}  immutable_frozenset: {immutable_frozenset}")
print(f"hex_id: {hex(id(frozenset_))}           frozenset_: {frozenset_}")

print("")
print("★★  mutable ★★")
print(f"hex_id: {hex(id(mutable_list))}         mutable_list: {mutable_list}")
print(f"hex_id: {hex(id(list_))}                list_: {list_}")
print(f"hex_id: {hex(id(mutable_dict))}         mutable_dict: {mutable_dict}")
print(f"hex_id: {hex(id(dict_))}                dict_: {dict_}")
print(f"hex_id: {hex(id(mutable_set))}          mutable_set: {mutable_set}")
print(f"hex_id: {hex(id(set_))}                 set_: {set_}")


# 해당 코드를 실행했을 때 나오는 결과를 유추하고
# mutable 자료형과 immutable 자료형은 어떤 게 있는지 알아야 함

 


📒 실행

# 결과

간단하게 살펴보면

immutable(불변) 객체와 변수의 좌표값은 다르다는 걸 알 수 있고 담고 있는 데이터도 다르다.

mutable(변할 수 있는) 객체와 변수의 좌표값은 같으며 담고 있는 데이터도 같다는 것을 알 수 있다. 

 

 

# 이해

mutable 한 객체를 담고있는 변수를 수정하면 원본 객체도 수정된다고 이해를 했다. 같은 좌표값을 참조한다고 해야 되나??

실제 mutable, immutable 객체가 변할 수 있는지 없는지 테스트는 아래 참고자료를 보면 자세하게 설명이 되어있다. 

좌표에 대한 부분도 설명되어 있는데 이 부분이 신기해서 직접 코드를 작성하고 테스트를 해봤다.

 

list, dict, set 등  mutable 한 자료구조를 사용할 때는 같은 좌표를 참고하기에 원본 데이터도 수정될 수 있다는 걸 명심하자!!

 


[참고자료]

https://www.mygreatlearning.com/blog/understanding-mutable-and-immutable-in-python/

 

Understanding Mutable and Immutable in Python

Mutable and Immutable in Python: Learn the Mutable and Immutable Objects in Python with this guide on the greatlearning blog.

www.mygreatlearning.com