튜플은 바꿀 수 없는 리스트예요
튜플과 리스트는 첫눈에 비슷해 보여요 — 둘 다 순서 있는 시퀀스고, 인덱싱과 순회를 지원하죠 — 하지만 한 가지 결정적인 차이가 모든 걸 바꿔요: 튜플은 불변(immutable) 이에요. 한 번 만든 튜플에는 뭔가를 추가할 수도, 제거할 수도, 아이템을 바꿀 수도 없어요.
튜플은 소괄호로 씁니다(가끔은 없이도 돼요):
아이템이 하나뿐인 튜플에는 뒤에 쉼표가 필요해요. 안 그러면 파이썬이 그 괄호를 묶음 괄호로만 읽어요:
빈 튜플은 () 로 씁니다:
불변성, 실제로
튜플을 바꾸려 하면 파이썬이 막아요:
튜플에서 _읽는 것_은 자유예요 — 인덱싱, 슬라이싱, 순회, in — 수정만 못 해요. 다른 튜플이 필요하면 새로 만드세요.
바꿀 수 없는 걸 굳이 왜?
불변성이 제약처럼 들리지만, 원하는 게 그 자체인 경우가 많아요.
- 안전함. 함수에 넘긴 튜플은 몰래 바뀔 수 없어요.
- 해시 가능성. 불변 값으로 이루어진 튜플은 딕셔너리 키나 집합 원소가 될 수 있어요. 리스트는 못 해요.
- 의도 표현. 튜플은 "이건 고정된 형태의 레코드다"라고 말해요.
point = (3, 4)는point = [3, 4]보다 "두 좌표"라는 뜻을 더 분명하게 전달해요.
튜플이 빛나는 용례:
- 좌표:
(x, y),(lat, lon) - RGB 색:
(255, 128, 0) - 레코드:
(name, email, signup_date) - 함수에서 여러 값 반환하기
언패킹
튜플과 언패킹 문법은 서로를 위해 만들어진 짝이에요:
왼쪽의 쉼표가 언패킹을 합니다. 파이썬이 이름 두 개와 값 두 개짜리 튜플을 보고 짝을 지어 바인딩해요.
관용적인 파이썬에서 어디든 등장하는 패턴이에요:
*로 "나머지"를 모을 수도 있어요:
처음과 끝 원소만 관심 있을 때 편해요.
딕셔너리 키로서의 튜플
튜플은 (안의 내용도 해시 가능하다면) 해시 가능하기 때문에 dict 키로 쓸 수 있어요. 리스트는 불가능합니다:
값들의 조합을 키로 쓰는 이 패턴은 생각보다 유용해요. "사용자 X의 Y일 점수"나 "A에서 B로 가는 최적 경로" 같은 것들요.
여러 반환값을 위한 튜플
여러 값을 돌려줘야 하는 함수는 보통 튜플을 반환해요:
파이썬 내장 divmod()가 정확히 이렇게 동작해요. 호출하는 쪽에서 언패킹 할당으로 받으면 자연스럽게 읽혀요.
네임드 튜플, 위치만으로는 부족할 때
튜플의 원소가 두세 개를 넘어서면 어느 위치가 뭐였는지 기억하는 게 지겨워져요. collections.namedtuple이 해결해 줍니다:
이제 튜플의 원소에 이름이 생겼어요. 여전히 불변이고 여전히 튜플이니까(언패킹과 인덱싱이 동작해요), 접근 방식이 훨씬 친절해요. 더 복잡한 경우에는 dataclasses가 있어요 — 클래스 챕터에서 만나게 됩니다.
튜플 vs 리스트: 빠른 결정 가이드
- 고정된 모양, 각 위치가 의미를 가짐 → 튜플.
- 커지거나 줄어들 수 있는 컬렉션 → 리스트.
- 함수에서 여러 값 반환 → 튜플.
- dict 키나 set 원소로 써야 함 → 튜플(리스트는 안 됨).
- 직접 수정해야 함 → 리스트(튜플은 안 해줌).
다음으로
튜플은 한쪽 스펙트럼을 담당해요: 고정되고, 작고, 구조화된 것. 다음은 집합입니다 — 완전히 다른 일을 맡아요. 빠른 멤버십 검사와 유일성이요.
자주 묻는 질문
파이썬의 튜플이 뭔가요?
튜플은 순서 있는 불변 시퀀스예요 — 리스트와 비슷하지만 한 번 만들어지면 아이템을 추가, 제거, 변경할 수 없어요. 소괄호로 작성합니다: point = (3, 4).
튜플과 리스트는 뭐가 다른가요?
둘 다 순서 있는 시퀀스예요. 리스트는 가변 — 만든 뒤에도 바꿀 수 있고 — 튜플은 불변이에요. 튜플은 보통 좌표나 함수의 여러 반환값처럼 하나의 "레코드"로 같이 다니는 작은 값 묶음에 써요.
언제 튜플을 써야 하나요?
각 위치가 의미를 갖는 고정 크기의 레코드 — 좌표, RGB 색, 데이터베이스 행 — 에 튜플을 쓰세요. 딕셔너리 키나 집합 원소로 쓰고 싶을 때도 튜플이 필요해요(리스트는 거기 못 써요). 그 외에 커지거나 줄어들 수 있는 컬렉션은 리스트가 기본이에요.