(댓글, 수정 환영합니다^^)
파이썬을 처음 접하는 사람들이 흔히 하는 질문들 중 하나가 튜플과 리스트의 차이이다.
두 가지의 자료형은 생긴 모습이나 형태가 비슷하지만 각자 다른 특징을 가지고 있고, 그에 따른 쓰임도 다르다.
튜플과 리스트의 공통점은 둘 다 어떠한 객체를 저장하는데 사용하는 컨테이너이다.
객체의 타입(자료형)과는 상관없이 해당 요소를 포함한다.
인덱싱(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'}
그래서 튜플이나 리스트에 저장되어있는 값 하나를 불러오고 싶을 때는 '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']
따라서 리스트에서는 가능한 .append()와 같은 메소드는 튜플에 적용되지 않는다.
리스트와 달리 내 입맛대로 변경 불가한 튜플이라는 자료형을 왜 만들었고 왜 사용하는 것일까?
그것은 변수와 상수를 예로 들 수 있다.
변수는 입력된 값을 코드 내에서 마음대로 바꿀 수 있다는 장점이 있고, 상수는 그렇지 않다. 하지만 상수는 변수에 비해 메모리 용량을 덜 차지하고 그만큼 더 좋은 성능(속도)을 낼 수 있다.