티스토리 뷰
파이썬에서는 데이터를 묶거나 푸는(packing & unpacking) 개념이 매우 중요하다. 특히, 다양한 iterable 자료형을 다룰 때 unpacking을 활용하면 훨씬 직관적이고 깔끔한 코드를 작성할 수 있다.
이번 글에서는 unpacking의 개념과 실제 사용 예시들을 정리해보겠다.

unpacking(언패킹)이란?
묶여있는 데이터를 하나씩 꺼내서 변수에 할당하는 작업이다.즉, packing의 반대 개념이다.

오른쪽에 위치한 iterable 데이터 (예. list, tuple, string, dictionary 등) 의 각 원소들이 변수에 순서대로 할당되는 작업이다.
# list unpacking
num1, num2, num3 = [1, 2, 3]
print(num1, num2, num3) # 1 2 3
# tuple unpacking
name, student_num = ('홍길동', 240515)
print(name, student_num) # 홍길동 240515
# string unpacking
s1, s2, s3 = 'ABC'
print(s1, s2, s3) # A B C
# dictionary unpacking
d1, d2, d3 = {'k1':1, 'k2':2, 'k3':3}.items()
print(d1, d2, d3) # ('k1', 1) ('k2', 2) ('k3', 3)
# set unpakcing
s1, s2, s3, s4, s5 = {'a', 'b', 'c', 'd', 'e'}
print(s1, s2, s3, s4, s5) # d c b e a
여기서, set은 순서가 없기 때문에 언패킹 시 주의해야 한다.
언패킹하면 순서대로가 아닌 뒤죽박죽으로 값이 할당되므로, 언패킹의 의미가 없어 거의 사용하지 않음
*을 이용한 unpacking
[일반적인 형태에서의 * 사용]
* 기호를 사용하면 리스트나 튜플, 문자열을 한꺼번에 풀어서 사용할 수 있다.
# list unpacking
l1 = [1,2,3,4,5]
print(*l1) # 1 2 3 4 5
# string unpacking
s1 = 'XYZ'
print(*s1) # [1, 2, 3, 4, 5, 'X', 'Y', 'Z']
# tuple unpacking
t1 = (1,2,3)
print(*t1) # 1 2 3
# 새로운 list 생성 가능
print([*l1,*s1,*t1]) # [1, 2, 3, 4, 5, 'X', 'Y', 'Z', 1, 2, 3]
이때, list, tuple로 싸지않고 그냥 *로 풀어헤치기만 한다면, 다음과 같이 syntaxError가 난다.
l1 = [1,2,3,4,5]
l2 = *l1

[함수에 *를 사용한 unpacking]
함수에 리스트나 튜플을 전달할 때 *을 사용하면, 각 요소를 개별 인자로 넘길 수 있다.
l = [1, 2, 3] # 리스트 정의
def func(num1,num2, num3):
print(num1) # 1
print(num2) # 2
print(num3) # 3
func(*l)
**을 이용한 unpacking
[일반적인 상황에서 ** 사용]
**는 dictionary를 unpacking할 때 사용한다.
*는 key만 언패킹하지만, **는 key와 vlaue 모두 언패킹한다.
d1 = {'k1':1, 'k2':2}
d2 = {'k3':3, 'k4':4}
d3 = {'k4':5, 'k6':6}
# *를 쓰면 key만 추출되어 set으로 묶임
print({*d1, *d2, *d3})
# {'k2', 'k3', 'k4', 'k6', 'k1'}
# **를 쓰면 key-value 쌍이 모두 유지됨
merged = {**d1, **d2, **d3}
print(merged)
# {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 5, 'k6': 6}
⚠️ 딕셔너리에서 같은 key가 중복되면, 나중에 정의된 값이 기존 값을 덮어씌웁니다.
# override example1
d1 = {'k1':1, 'k2':2}
d2 = {'k1':3, 'k4':4, **d1}
print(d2) # {'k1': 1, 'k4': 4, 'k2': 2}
# override example2
d1 = {'k1':1, 'k3':2}
d2 = { **d1, 'k1':3, 'k4':4}
print(d2) # {'k1': 3, 'k3': 2, 'k4': 4}
[함수에 **를 사용한 unpacking]
함수 인자로 딕셔너리를 넘길 때 **를 사용하면 key-value 쌍이 인자 이름과 값으로 들어간다.
이때 관용적으로 **kwargs를 사용한다.
**kwargs: keyword 매개변수로, 전달되는 인수를 딕셔너리 형태의 변수에 저장하는 방법이다.
def func(**kwargs):
print(kwargs) # {'a': 1, 'b': 2, 'c': 3}
func(a=1, b=2, c=3)
마무리
사용 대상 | 역할 | |
* | 리스트, 튜플, 문자열 | 요소를 하나씩 풀어서 전달 |
** | 딕셔너리 | key-value 쌍으로 풀어서 전달 |
함수에서 * | 위치 인자 (args) | 리스트/튜플 등을 개별 인자로 분해 |
함수에서 ** | 키워드 인자 (kwargs) | 딕셔너리를 키워드 인자로 분해 |
'파이썬' 카테고리의 다른 글
[Python 파이썬] eval() 함수와 exec() 함수 개념 및 차이점, 예제 (0) | 2024.05.18 |
---|---|
[Python 파이썬] *args와 **kwargs 개념과 예제 (0) | 2024.05.16 |
[Python 파이썬] eval() 함수: '수식' 연산 (0) | 2024.05.15 |
[Python 파이썬] 패킹(packing) 개념과 예제 (0) | 2024.05.15 |
[Python 파이썬] replace() 함수: '문자열 치환' (0) | 2024.05.15 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- cnn
- *
- 앤드류응
- ML 프로세스
- Sort
- 파이썬
- **
- 머신러닝
- Andrew Ng
- 백준
- 머신러닝 프로세스
- 비용함수
- python
- 강화학습
- 로지스틱 회귀
- ML
- droput
- *args
- baekjoon
- 손실함수
- ML와 DL 차이
- 딥러닝
- 경사하강법
- CNN에서의 활성화 함수
- ML 학습 방법
- sorted
- 숏코딩
- **kwargs
- 강의노트 정리
- NumPy
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
글 보관함