Python: 튜플 값 변경이나 추가 및 삭제 가능한가?
지난 포스팅에 이어 파이썬의 대표적인 자료형인 튜플에 대해서 보도록 하겠다.
정의에 의하면 튜플은 immutable (변경 불가)한 자료형이기 때문에 한 번 정해지면 바꿀 수 없다. 하지만 변경하는 것에 대한 방법을 종종 보게 된다. 대표적으로
- 리스트로 변환해서 append()로 추가하고 다시 튜플로 변환
- 슬라이싱(slicing)을 통한 원소 추가
1 번 방법
아래 코딩은 1번의 방법으로 튜플을 변경한 것이다. 변경이 가능한 것처럼 보이지만 id()를 통해 튜플의 메모리 주소를 출력해 보면 다른 변수라는 것을 알 수 있다. 즉, 변경된 튜플은 변경하는 동안 새롭게 만들어진 튜플이라는 것이다.
2번 방법
이번엔 2번의 방법으로 튜플을 변경해 보자. 마찬가지로 변경 가능하지만 주소가 달라진 것을 알 수 있다. 즉, 변경된 튜플은 새로운 튜플이라는 것이다.
결론
정리하면 튜플은 파이썬의 정의대로 변경이 불가능하다. 변경이 되었다면 그것은 새로운 튜플을 만든 것일뿐이다. 이때, 원래 있던 튜플은 여전히 메모리를 차지하고 있게 된다. 따라서, 코딩시 지속적으로 변하는 배열을 다루기를 원한다면 튜플은 좋은 선택이 아니다. 리스트를 사용해야 할 것이다.
이렇게 메모리를 가리키는 변수의 이름이 달라져 원래 차지하고 있던 메모리에 대한 참조가 풀렸다면 그 메모리를 다시 돌려주어야 한다. 그래야 나중에 메모리 누출이 일어나지 않을 것이다. 파이썬에서는 이부분이 자동적으로 일어나기 때문에 대부분의 경우에 큰 문제가 되지 않는다고 알려져 있다.
그럼에도 메모리를 관리하는 차원에서 알아 두면 좋을 것이 weak reference라는 것이고, 이것은 garbage collection이라는 매소드와 함께 사용해 메모리를 관리한다. 다음 포스팅에서 weak reference에 대해서 보도록 하겠다.
'Programming > Python' 카테고리의 다른 글
[Python] bound / unbound method란? (feat. static method) (1) | 2021.04.29 |
---|---|
[Python] How to flatten a matrix (행렬을 1차원 배열로 전환하기) (0) | 2020.11.09 |
[Python] How to initialize dictionary by get method (0) | 2020.11.08 |
[Python] Abstract Classes(추상클래스)의 객체 생성은 가능한가? (1) | 2020.11.06 |
[Python] 리스트(list) vs 튜플(tuple)! (0) | 2020.11.05 |
댓글