Search
Duplicate

List vs Tuple

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Python
Scrap
태그
기초
9 more properties
(댓글, 수정 환영합니다^^)

서론

파이썬을 처음 접하는 사람들이 흔히 하는 질문들 중 하나가 튜플과 리스트의 차이이다.
두 가지의 자료형은 생긴 모습이나 형태가 비슷하지만 각자 다른 특징을 가지고 있고, 그에 따른 쓰임도 다르다.

공통점

튜플과 리스트의 공통점은 둘 다 어떠한 객체를 저장하는데 사용하는 컨테이너이다.
객체의 타입(자료형)과는 상관없이 해당 요소를 포함한다.
인덱싱(indexing)이 가능하다.
이는 순서가 존재한다는 말로 어떻게 보면 '튜플이나 리스트와 같이 여러 개의 객체를 저장하는 자료형인 집합(set)이나 딕셔너리(dictionary)도 데이터를 순서대로 내가 입력해서 저장하니, 이것 또한 순서가 매겨지는 것 아닌가?' 라고 생각할 수 있다. 하지만 출력을 해보면 그렇지 않다.
_tuple_ = (1,2,3,'a','b','c') print(_tuple_) #(1, 2, 3, 'a', 'b', 'c') _set_ = set([1,2,3,'a','b','c']) print(_set_) #{1, 2, 3, 'b', 'a', 'c'}
Python
복사
그래서 튜플이나 리스트에 저장되어있는 값 하나를 불러오고 싶을 때는 'tuple[0]' 과 같은 방식으로 불러올 수 있다.

차이점

튜플과 리스트의 차이점은 불변성(immutable)과 가변성(mutable)의 성질을 각각 가진다는 점이다.
(mutable과 immutable에 대한 자세한 설명은 아래 참조)
위에서 두 가지의 자료형은 인덱싱이 가능하다고 했다. 그렇다면 내가 초기에 설정해준 값을 이 후에도 바꾸고 싶을 때 리스트의 경우에는 인덱싱을 해 주고, 해당 인덱스의 값을 바꿔 줄 수 있다. 하지만 튜플은 수정이 불가 하기 때문에 위와 같은 과정은 불가능하다.
_tuple_ = (1,2,3,'a','b','c') _list_ = [1,2,3,'a','b','c'] print(_tuple_) #(1, 2, 3, 'a', 'b', 'c') print(_list_) #[1, 2, 3, 'a', 'b', 'c'] _list_[0] = 5 _tuple_[0] = 5 print(_tuple_) #Error!(사실 튜플을 변경하려는 시도 자체가 에러 발생요소이다.) print(_list_) #[5, 2, 3, 'a', 'b', 'c']
Python
복사
따라서 리스트에서는 가능한 .append()와 같은 메소드는 튜플에 적용되지 않는다.

왜 튜플을 사용하는가?

리스트와 달리 내 입맛대로 변경 불가한 튜플이라는 자료형을 왜 만들었고 왜 사용하는 것일까?
그것은 변수와 상수를 예로 들 수 있다.
변수는 입력된 값을 코드 내에서 마음대로 바꿀 수 있다는 장점이 있고, 상수는 그렇지 않다. 하지만 상수는 변수에 비해 메모리 용량을 덜 차지하고 그만큼 더 좋은 성능(속도)을 낼 수 있다.
튜플도 마찬가지로 리스트에 비해 메모리 용량에 부담이 없고, 그래서 비교적 가볍다.

리스트는 무겁고 튜플은 가볍다?

튜플과 리스트 사이에서 비교적 가볍고 무겁다는 관계가 성립되는 이유는 파이썬에서 둘을 구성하는 방식에서 나타난다.

1.동적 요소의 유무

C언어 공부를 조금이라도 했던 사람들은 알 것이다. 분명 리스트는 그렇게 마음대로 크기가 줄었다가 늘었다가 하는 것이 아닐텐데? 라고. 하지만 C언어를 기반으로 만들어진 파이썬에서는 .append() 또는 .delete()와 같은 메소드로 쉽고 빠르게 리스트의 크기를 조절할 수 있다. 이는 파이썬에서의 리스트 개념과 C에서의 리스트 개념이 조금 다른 점에서 출발한다.
파이썬의 리스트는 C에서의 리스트와 동적 할당의 개념을 합친 것과 비슷하다고 볼 수 있다. (완전히 합쳤다고 보기는 어렵지만 이해를 돕기 위해서)
파이썬에서 리스트를 초기화한 이후, 요소를 추가해서 리스트의 크기가 원래의 크기보다 커졌을 때, 내부에서는 더블링(doubling)이라는 과정을 거친다. 이는 원래 리스트 크기에서 그 두 배의 크기로 할당량을 변화 시켜 주는 과정이다. (이에 대한 자세한 설명은 생략하겠다.) 중요한 점은 우리가 C에서는 정적인 특징을 가지고 있던 리스트라는 자료형이 파이썬에서는 동적이라는 요소를 포함하고 있다는 것이다.
그렇기 때문에 리스트는 튜플보다 비교적 무거운 자료형일 수 밖에 없는 것이다.

2.가변/불변

튜플과 리스트의 차이점에 대해 이야기 할 때, 각각 불변과 가변의 성질을 가지고 있다고 했다. 이러한 특징이 컴퓨터 내부에서는 어떠한 차이점을 야기할까?
당연하게도 가변 객체는 불변 객체보다 오버헤드(어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리 등을 말한다.)가 크다.
위와 같은 이유로 변하지 않는 요소를 객체로 표현하거나, 데이터 손실에 대한 안정성을 확보하고 싶을 때, 불변 객체 중 하나인 튜플을 사용하는 것이다.