Python 언패킹과 다중 할당
요약
Python의 다중 할당(a, b = 1, 2), 튜플 언패킹, 두 변수 swap, for 루프와 enumerate 언패킹, 함수 반환값 받기, *rest 확장 언패킹까지. 정보처리기사 실기에 자주 등장하는 Python 언패킹 패턴을 정리합니다.
언패킹 핵심 정리
| 패턴 | 설명 | 예시 |
|---|---|---|
| 다중 할당 | 여러 변수에 여러 값을 한 번에 대입 | a, b = 1, 2 |
| 튜플 언패킹 | 튜플의 각 원소를 변수에 풀어 받기 | x, y = (10, 20) |
| swap | 임시 변수 없이 두 값 교환 | a, b = b, a |
| for 루프 언패킹 | 반복문에서 (a, b) 형태 원소를 두 변수로 받기 | for k, v in items: |
| enumerate 언패킹 | 인덱스와 값을 동시에 받기 | for i, x in enumerate(lst): |
| 함수 반환값 언패킹 | 여러 값을 반환하는 함수의 결과를 분리해 받기 | q, r = divmod(10, 3) |
* 확장 언패킹 | 일부는 단일 변수, 나머지는 리스트로 받기 | head, *rest = [1, 2, 3, 4] |
언패킹이란? 쌩기초
언패킹(unpacking)은 "묶여 있는 값들을 풀어서 여러 변수에 한 번에 나눠 담는 것"을 말합니다. Python에서는 = 기호의 왼쪽에 변수를 여러 개 적으면, 오른쪽의 묶음(튜플·리스트 등)이 자동으로 풀려서 각 변수에 차례대로 들어갑니다.
위에서 오른쪽의 10, 20은 사실 (10, 20) 튜플과 동일합니다. Python은 = 오른쪽에 콤마로 값을 나열하면 자동으로 튜플로 묶고, = 왼쪽에 변수를 여러 개 적으면 다시 풀어서 변수에 나눠 담아요.
다중 할당 (multiple assignment) 쌩기초
가장 기본 형태는 = 기호 양쪽에 같은 개수의 항목을 두는 것입니다.
왼쪽 변수의 개수와 오른쪽 값의 개수가 다르면 오류가 납니다.
튜플 언패킹 쌩기초
오른쪽이 명시적인 튜플이어도 동일하게 동작합니다.
리스트도 같은 방식으로 풀어서 받을 수 있습니다.
소괄호 ()나 대괄호 []로 묶인 값이라면 모두 언패킹의 대상이 될 수 있어요. 핵심은 "묶음의 원소 개수"와 "왼쪽 변수의 개수"가 같아야 한다는 것입니다.
두 변수 swap (동시 교환) 기초
다른 언어에서는 두 변수의 값을 바꾸려면 임시 변수를 써야 합니다.
Python에서는 언패킹을 이용해 한 줄로 swap할 수 있습니다.
내부적으로는 오른쪽 b, a가 먼저 (2, 1) 튜플로 묶이고, 그 튜플이 왼쪽의 a, b로 풀려 들어갑니다. 그래서 a와 b의 값이 동시에 바뀌는 효과가 나요.
for 루프에서 언패킹 기초
for 루프가 매 회차 꺼내는 원소가 묶음(튜플·리스트)이라면, 그 자리에서 바로 풀어 받을 수 있습니다.
위 코드는 다음과 같이 풀어 쓰는 것과 동일합니다.
for num, ch in pairs:라고 쓰면 매 회차 꺼낸 튜플이 자동으로 num과 ch에 풀려 들어가서 코드가 훨씬 짧아집니다.
딕셔너리의 items() 메서드는 (키, 값) 튜플을 차례로 돌려주므로, for 루프 언패킹과 자주 함께 쓰입니다.
enumerate와 함께 사용 기초
enumerate 함수는 매 회차 (인덱스, 값) 형태의 튜플을 돌려줍니다. 그래서 for 루프에서 언패킹과 거의 항상 함께 사용됩니다.
for index, fruit in enumerate(fruits):에서 index, fruit 부분이 언패킹 자리예요. enumerate가 (0, "사과") 같은 튜플을 만들면, 앞의 0은 index에, 뒤의 "사과"는 fruit에 자동으로 들어갑니다.
만약 언패킹을 쓰지 않으면 다음처럼 길어집니다.
언패킹을 사용하면 첫 번째 코드처럼 한 줄로 깔끔하게 쓸 수 있어요.
함수 반환값 언패킹 심화
Python 함수는 콤마로 여러 값을 한 번에 반환할 수 있습니다. 이때 반환값은 자동으로 튜플로 묶여 나가고, 호출하는 쪽에서 언패킹으로 받을 수 있어요.
Python 표준 함수 중에도 두 값을 반환하는 함수가 있습니다. 대표적인 예가 divmod()입니다.
input().split() 결과 언패킹
input()이 돌려준 한 줄짜리 문자열을 split()으로 자르면 리스트가 만들어지고, 이 리스트를 다중 할당으로 여러 변수에 한 번에 받을 수 있습니다. 키보드로 받은 값을 두 변수에 동시에 담는 정형 패턴입니다.
split()이 돌려준 리스트의 원소 개수와 좌변 변수의 개수가 정확히 같아야 합니다. 입력값을 정수로 사용하려면 int()로 한 번 더 변환합니다.
별표(*) 확장 언패킹 심화
언패킹할 때 변수 앞에 *를 붙이면, "남은 원소들을 모두 리스트로 받아라"는 뜻이 됩니다.
*는 가운데에 둘 수도 있고, 마지막에 둘 수도 있어요.
*가 붙은 변수는 항상 리스트로 결과를 받습니다 (원소가 0개여도 빈 리스트 []를 받아요).