여기서는 둘 다 list와 다르다는 점보다 순서 있는 고정 묶음이 필요한지, 아니면 중복 없는 원소 집합이 필요한지를 먼저 봅니다.
값 묶음의 의미를 유지하면 tuple, 존재 여부와 중복 제거가 핵심이면 set이 맞습니다.
빠른 비교
point = (10, 20)
seen_ids = {101, 102, 103}
if 102 in seen_ids:
print("already seen")
x, y = point문법
기본형은 tuple 리터럴, 단일 원소 tuple, set 리터럴, 빈 set, membership, 언패킹까지 같이 보면 됩니다.
point = (3, 7)
single = (1,)
blocked = {"spam", "bot"}
blocked = set()
x, y = point
is_blocked = "spam" in blockedtuple은 순서가 있는 고정 묶음이고, set은 중복 없는 원소 집합입니다.
둘 다 list의 대체품이 아니라 질문 자체가 다른 컬렉션입니다.
고정 묶음
바꾸지 않을 값 묶음이면 tuple이 맞다
tuple은 리스트처럼 순서가 있지만 변경할 수 없습니다. 그래서 좌표, 날짜 조각, 여러 값을 한 번에 반환하는 결과처럼 구조는 있지만 수정 의도가 없는 데이터에 잘 맞습니다.
point = (3, 7)
name_age = ("Mina", 26)
x, y = pointtuple의 핵심은 "더 빠르다"보다 "이 값 묶음은 고정이다"라는 의미를 드러내는 데 있습니다.
집합 연산
중복 제거와 membership 테스트면 set이 맞다
set은 순서보다 원소 존재 여부가 중요한 문제에 강합니다.
중복 제거, 빠른 in 검사, 교집합/차집합 계산이 대표적입니다.
names = ["mina", "jin", "mina", "sora"]
unique_names = set(names)
blocked = {"spam", "bot"}
if user_type in blocked:
print("deny")리스트에서 in 검사를 반복하는 패턴이 보이면 set이 더 잘 맞는지 먼저 보는 편이 좋습니다.
비교 축
list, tuple, set은 각각 다른 질문에 답한다
세 컬렉션을 같이 놓고 보면 차이가 더 선명합니다.
- 순서 있고 수정도 필요함:
list - 순서 있는 고정 값 묶음:
tuple - 중복 없고 존재 여부가 중요함:
set
values = [1, 2, 2, 3]
pair = (1, 2)
unique = {1, 2, 3}즉 "여러 값을 담는다"는 공통점보다 순서 / 수정 / 중복 / 조회 방식이 더 중요합니다.
읽는 방식
tuple은 언패킹과, set은 순서 비보장과 같이 읽는다
tuple은 단독보다 "여러 값을 한 번에 받는다"는 상황에서 많이 보입니다.
함수 반환값, 좌표, (key, value) 쌍 같은 곳에서 자연스럽게 연결됩니다.
point = (10, 20)
x, y = point이 때문에 tuple 카드는 unpacking-and-starred 카드와 읽기 흐름이 이어집니다.
반대로 set은 순서 보존용이 아니므로, "첫 번째 원소" 같은 개념으로 읽기 시작하면 어색해집니다.
주의할 점
set은 인덱스로 접근할 수 없고, 순서가 중요한 용도에도 맞지 않습니다. 순서를 기대하면 코드가 불안정해집니다.
# ❌ set은 인덱싱 불가
colors = {"red", "green", "blue"}
first = colors[0]
# ✅ 순서가 중요하면 list나 tuple 사용
colors = ["red", "green", "blue"]
first = colors[0]# ❌ tuple 안의 가변 객체는 내부에서 바뀔 수 있다
point = ([1, 2], 3)
point[0].append(4)
# tuple 자체 재할당은 안 되지만 내부 mutable state는 별개다참고 링크
2 sources