
파이썬은 여러 값을 하나로 묶어 다루는 대표적인 내장 자료구조로 리스트(list), 딕셔너리(dict), 튜플(tuple), 셋(set) 네 가지를 제공합니다. 각각 순서, 변경 가능 여부, 중복 허용 여부가 다르며, 상황에 맞게 선택해서 사용합니다.
이 네 가지는 파이썬 공식 문서에서 "내장 자료형(built-in types)"으로 분류되며, 별도의 라이브러리를 설치하지 않아도 바로 사용할 수 있습니다. 실무에서는 데이터의 성격(순서가 중요한지, 값이 바뀌면 안 되는지, 키-값 구조인지, 중복을 허용해야 하는지)을 먼저 파악한 뒤 자료구조를 선택하는 것이 일반적인 접근 방식입니다.
기능/스펙
| 자료구조 | 순서 유지 | 변경 가능(mutable) | 중복 허용 | 예시 |
|---|---|---|---|---|
| list | O | O | O | [1, 2, 3] |
| tuple | O | X | O | (1, 2, 3) |
| dict | O (3.7+ 삽입 순서 보장) | O | 키는 불가, 값은 가능 | {"a": 1} |
| set | X | O | X | {1, 2, 3} |
- 리스트: 대괄호로 생성하며, 순서가 있고 값을 자유롭게 추가/삭제/변경할 수 있습니다.
- 튜플: 소괄호로 생성하며, 한 번 만들면 값을 변경할 수 없습니다(immutable). 이 특성 덕분에 딕셔너리의 키로 사용할 수 있습니다.
- 딕셔너리:
키: 값쌍으로 이루어지며, Python 공식 문서에 따르면 Python 3.7부터 딕셔너리는 삽입된 순서를 보장합니다. (3.6에서는 CPython 구현상의 특성으로 순서가 유지되었으나, 언어 명세로 공식화된 것은 3.7입니다.) - 셋: 중복을 허용하지 않는 집합 자료구조로, 합집합·교집합·차집합 연산을 지원합니다.
my_list = [1, 2, 2, 3]
my_tuple = (1, 2, 3)
my_dict = {"name": "홍길동", "age": 25}
my_set = {1, 2, 2, 3} # {1, 2, 3}으로 저장됨 (중복 제거)
리스트와 튜플은 인덱스와 슬라이싱으로 원하는 범위의 값을 꺼낼 수 있고, 딕셔너리는 .get(), .keys(), .values() 같은 메서드로 값을 안전하게 조회할 수 있습니다.
numbers = [10, 20, 30, 40, 50]
print(numbers[1:3]) # [20, 30]
person = {"name": "홍길동", "age": 25}
print(person.get("age")) # 25
print(person.get("job", "정보 없음")) # 키가 없으면 기본값 반환
장단점
장점 - 리스트: 순서가 있는 데이터를 유연하게 다룰 수 있음 - 튜플: 변경되지 않아야 하는 데이터(좌표, 설정값 등)를 안전하게 보호할 수 있음 - 딕셔너리: 키를 통한 조회 속도가 빠름(내부적으로 해시 테이블 기반) - 셋: 중복 제거, 집합 연산에 최적화됨
단점 - 리스트: 중간 삽입/삭제가 잦으면 다른 자료구조(예: collections.deque) 대비 성능이 떨어질 수 있음 - 튜플: 값 변경이 필요한 상황에서는 사용할 수 없어 유연성이 떨어짐 - 딕셔너리/셋: 키(또는 원소)는 반드시 해시 가능한(hashable) 값이어야 하므로, 리스트처럼 변경 가능한 객체는 키로 사용할 수 없음
비판적 시각
입문자들이 자주 혼동하는 지점은 "리스트와 튜플의 성능 차이가 실질적으로 얼마나 큰가"입니다. 일반적으로 튜플이 리스트보다 약간 가볍고 생성 속도가 빠르다고 알려져 있으나, 정확한 수치(예: 몇 퍼센트 차이)는 파이썬 버전, 하드웨어, 벤치마크 방법에 따라 달라지므로 이 글에서 구체적인 수치를 단정하지 않습니다. 성능이 중요한 경우 timeit 모듈로 직접 측정하는 것이 정확합니다. 또한 딕셔너리의 순서 보장이 "3.6부터"인지 "3.7부터"인지 혼동하는 자료가 많은데, Python 공식 문서 기준으로는 3.7부터가 언어 명세상 공식 보장 시점입니다.
추천 대상
- 데이터를 순서대로 관리해야 하는 경우: 리스트
- 값이 절대 바뀌면 안 되는 경우: 튜플
- 키-값 쌍으로 데이터를 관리해야 하는 경우(예: 설정값, JSON 유사 구조): 딕셔너리
- 중복 제거나 집합 연산이 필요한 경우: 셋
FAQ
Q1. 리스트와 튜플 중 뭘 써야 하나요? 데이터가 변경될 가능성이 있으면 리스트, 변경되지 않아야 하면 튜플을 사용하는 것이 일반적인 기준입니다.
Q2. 딕셔너리의 키로 리스트를 쓸 수 있나요? 아닙니다. 리스트는 변경 가능한(mutable) 객체라 해시할 수 없어 딕셔너리 키로 사용할 수 없습니다. 대신 튜플은 키로 사용할 수 있습니다.
Q3. 셋(set)의 순서는 어떻게 되나요? 셋은 순서를 보장하지 않는 자료구조입니다. 원소를 출력하는 순서는 삽입 순서와 일치하지 않을 수 있습니다.
Q4. 딕셔너리에서 없는 키를 조회하면 오류가 나나요? 대괄호(person["job"])로 없는 키를 조회하면 KeyError가 발생합니다. 오류 없이 안전하게 조회하려면 .get() 메서드를 사용하는 것이 일반적입니다.
출처
- Python 공식 문서, "The Python Tutorial – 5. Data Structures" (docs.python.org)
- Python 공식 문서, "What's New in Python 3.7" (dict 순서 보장 관련, docs.python.org)