파이썬의 시퀀스 자료형, 리스트와 튜플
파이썬에서 리스트(list)와 튜플(tuple)은 모두 시퀀스(sequence) 자료형으로 분류됩니다. 두 자료형의 객체는 쉼표로 구분된 여러 항목들의 모음이며, 각 항목이 반드시 동일한 자료형일 필요는 없다는 점도 서로 같습니다.
공통점
리스트와 튜플 모두 연결(concatenation), 반복(repetition), 인덱싱(indexing), 슬라이싱(slicing) 연산을 동일하게 지원합니다.
리스트 연산 예제
>>> # 리스트 생성
>>> L1 = [1, 2, 3]
>>> L2 = [4, 5, 6]
>>> # 연결(concatenation)
>>> L3 = L1 + L2
>>> L3
[1, 2, 3, 4, 5, 6]
>>> # 반복(repetition)
>>> L1 * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> # 인덱싱
>>> L3[4]
5
>>> # 슬라이싱
>>> L3[2:4]
[3, 4]
튜플 연산 예제
>>> # 튜플 생성
>>> T1 = (1, 2, 3)
>>> T2 = (4, 5, 6)
>>> # 연결(concatenation)
>>> T3 = T1 + T2
>>> T3
(1, 2, 3, 4, 5, 6)
>>> # 반복(repetition)
>>> T1 * 3
(1, 2, 3, 1, 2, 3, 1, 2, 3)
>>> # 인덱싱
>>> T3[4]
5
>>> # 슬라이싱
>>> T3[2:4]
(3, 4)
아래의 내장 함수들 역시 두 자료형에서 모두 사용할 수 있습니다.
len() − 시퀀스에 포함된 요소의 개수를 반환합니다.
>>> L1 = [45, 32, 16, 72, 24]
>>> len(L1)
5
>>> T1 = (45, 32, 16, 72, 24)
>>> len(T1)
5
max() − 요소 중 가장 큰 값을 반환합니다.
>>> max(L1)
72
>>> max(T1)
72
min() − 요소 중 가장 작은 값을 반환합니다.
>>> min(L1)
16
>>> min(T1)
16
차이점
리스트는 가변(mutable) 객체
리스트 객체는 가변(mutable)입니다. 따라서 생성된 이후에도 항목을 자유롭게 추가, 수정, 삭제할 수 있습니다.
>>> L1 = [45, 32, 16, 72, 24]
>>> L1.append(56) # 항목 추가
>>> L1
[45, 32, 16, 72, 24, 56]
>>> L1.insert(4, 10) # 4번째 인덱스에 10 삽입
>>> L1
[45, 32, 16, 72, 10, 24, 56]
>>> L1.remove(16) # 값 16 삭제
>>> L1
[45, 32, 72, 10, 24, 56]
>>> L1[2] = 100 # 값 수정
>>> L1
[45, 32, 100, 10, 24, 56]
튜플은 불변(immutable) 객체
반면 튜플은 불변(immutable) 객체입니다. 한 번 생성된 튜플은 수정할 수 없으며, 변경을 시도하는 모든 연산은 AttributeError 또는 TypeError를 발생시킵니다.
>>> T1.append(56)
AttributeError: 'tuple' object has no attribute 'append'
>>> T1.remove(16)
AttributeError: 'tuple' object has no attribute 'remove'
>>> T1[2] = 100
TypeError: 'tuple' object does not support item assignment
정리: 언제 무엇을 사용해야 할까?
데이터를 읽기 전용으로 보관하거나 딕셔너리의 키처럼 해시 가능한 값이 필요할 때는 튜플이 적합하고, 데이터를 자주 추가·삭제·수정해야 한다면 리스트가 좋은 선택입니다. 참고로 튜플은 리스트보다 메모리를 적게 사용하고 처리 속도도 약간 더 빠르다는 장점이 있습니다.