728x90
불변 타입(immutable type)
한 번 생성되면 그 상태를 변경할 수 없는 데이터 타입. immutable type의 대표적인 예로는 int, float, str, tuple 등이 있음.
immutable type의 특징
>>> a = "hello"
>>> b = ["hello", "world"]
>>> print(id(a), id(b), id(b[0]))
4340666864 4340667776 4340666864
>>> print(id(a) == id(b[0])
True
- 메모리 효율성: 동일한 값을 가진 객체가 메모리에 한 번만 저장될 수 있기 때문에 메모리 사용을 최적화할 수 있다. 예를 들어, “python”이라는 값을 가진 a와 b가 있으면 둘 다 같은 메모리 주소를 가리킨다.
- 따라서 이 때 immutable object의 값을 변경하고 싶고, 그것을 시도할 때 python은 값을 재할당하는 과정을 거친다.
>>> a = "python2"
>>> id(a)
4399272816
>>> a = "python3"
>>> id(a)
4399272880
위 코드는 다음과 같이 순차적으로 수행된다.
- 'python2'라는 문자열 객체가 메모리의 4399272816번지에 할당되고 해당 객체를 a라는 변수가 바인딩한다.
- ‘python3’라는 문자열 객체가 메모리의 4399272880 번지에 할당되고 해당 객체를 a라는 변수가 바인딩한다.
- ‘python2’라는 문자열 객체는 아무도 자신을 참조하지 않기 때문에 garbage collection에 의해 자동으로 메모리에서 소멸된다.
str은 immutable object이기 때문에, str 안에 있는 특정 character를 바꾸고자 하면 에러가 발생한다. 따라서 문자열을 바꾸고 싶으면, 문자열 값을 재할당해야 하며, 이 때 참조하는 메모리 주소도 바뀐다.
>>> s= "abc"
>>> s
'abc'
>>> id(s)
4387454680
>>> s[0]
'a'
>>> s[0] = 's'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> s = 'def'
>>> s
'def'
>>> id(s)
4388970768
- Hashability: immutable object는 그 상태가 변경되지 않기 때문에, 객체 생성 시점의 해시값을 계산하여 저장하고 이후에는 이 값을 재사용할 수 있다. 이 특성 때문에 immutable object는 dictionary의 key나 set의 원소로 사용될 수 있다.
예시
- int, float, str, tuple, boolean, Nonetype, frozen set
가변 타입(mutable type)
생성 후에도 그 상태를 변경할 수 있는 데이터 타입. Python에서 대표적인 예로는 list, dictionary(dict), set 등이 있다. mutable type의 객체는 내용을 추가, 삭제, 변경하는 등의 연산을 통해 객체의 상태를 직접 수정할 수 있다.
mutable type의 특징
>>> a = [1, 2, 3]
>>> id(a)
**4393788808**
>>> a[0] = 5
>>> a
[5, 2, 3]
>>> id(a)
**4393788808**
- 객체가 생성된 이후에도 내용을 변경할 수 있어 동적인 데이터 구조를 유연하게 다룰 수 있다.
- 메모리 효율성: 객체의 상태를 변경할 때마다 새로운 객체를 생성하지 않아도 되므로, 특정 상황에서는 메모리 사용량을 줄일 수 있다.
- Hashability: mutable object는 내부 상태가 변경될 수 있기 때문에, 일반적으로 해시가 가능하지 않다. 이는 가변 객체를 딕셔너리의 키나 세트의 원소로 사용할 수 없다는 뜻이다.
- copy: 가변타입을 “복사”할 때는 shallow copy와 deep copy의 개념이 중요해진다.
- shallow copy를 사용하면, 새로운 리스트 객체가 생성되지만, 리스트 내부의 요소들은 원본 리스트의 요소들과 동일한 참조(주소)를 공유한다. 따라서, 리스트 내부의 객체를 변경하면, 원본과 복사본 모두에 영향을 준다.
- deep copy를 사용하면, 리스트와 리스트 내부의 모든 요소들까지 재귀적으로 복사되어, 완전히 독립적인 복사본을 생성한다. 원본 리스트를 변경해도 복사본에는 영향을 주지 않는다.
예시
- list, dictionary, set, bytearray
참고자료
chatgpt
728x90
'정리' 카테고리의 다른 글
[python] shallow copy vs deep copy (0) | 2024.03.04 |
---|---|
Likelihood와 MLE(Maximum Likehood Estimation, 최대우도추정법) (0) | 2023.04.14 |
Bayse's rule(베이즈 정리) (0) | 2023.04.13 |
[colab+spark] colab에서 spark 쓰는법 (0) | 2021.12.01 |
[DataScience 기초](정리 필요) group-k fold (0) | 2021.10.27 |