티스토리 뷰

 

파이썬에서는 데이터를 묶거나 푸는(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) 딕셔너리를 키워드 인자로 분해

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
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
글 보관함