Python

[Python] 가변 객체 (Mutable)

비번변경 2023. 12. 15. 17:13

객체 종류

Python에서는 객체를 두 가지 종류로 구분할 수 있다.

  • Mutable : 가변객체. 상태를 변경할 수 있는 객체
  • Immutable : 불변객체. 상태를 변경할 수 없는 객체

여기서 상태란 값을 의미한다. 즉, 어떤 변수에 값을 할당하고 갱신할 때 저장된 값의 데이터형의 종류에 따라 동작방식이 다르다.

2023.12.14 - [Python] 불변 객체 (Immutable)에서는 불변 객체에 대해서 정리했는데 이 글에서는 가변 객체에 대해 정리한다.

 

 

가변(Mutable) 객체

1. 변수에 할당한 값이 달라져도 변수가 참조하는 메모리 주소가 달라지지 않는다.

a = ["python2", "python3"]
print(f"""a={a}
      id(a)={id(a)}""")

a.append('python4')
print(f"""a={a}
      id(a)={id(a)}""")

리스트의 각 원소는 문자열 객체를 참조하는 구조로 되어 있다.

따라서 리스트에 원소를 추가하거나 삭제해도 리스트 객체의 시작 주소는 변경되지 않는다.

 

2. 여러 변수에 같은 값을 할당해도 변수마다 별개의 메모리 주소를 참조한다.

a = ["python2", "python3"]
b = ["python2", "python3"]
print(f"""a={a}, id(a)={id(a)}""")
print(f"""b={b}, id(b)={id(b)}""")

 

3. 어떤 변수를 다른 변수에 복사하면 두 변수는 같은 메모리 주소를 참조한다.

a = ["python2", "python3"]
b = a
print(f"""a={a}, id(a)={id(a)}""")
print(f"""b={b}, id(b)={id(b)}""")

따라서 두 변수를 같은 값으로 초기화하는 것과 변수를 복사하는 것은 다른 동작이다.

 

4. 어떤 변수를 복사한 후, 변숫값이 달라지면 다른 변수에도 영향을 준다.

a = ["python2", "python3"]
b = a
print(f"""a={a}, id(a)={id(a)}""")
print(f"""b={b}, id(b)={id(b)}""")

print('\n--값 갱신--')
a.append('python4')
print(f"""a={a}, id(a)={id(a)}""")
print(f"""b={b}, id(b)={id(b)}""")

 

 

참고 문서

https://wikidocs.net/91520

https://blockdmask.tistory.com/570

https://wikidocs.net/32277