본문 바로가기
Study/Python

[Python] 패킹(packing), 언패킹(unpacking)

by ngool 2024. 7. 31.

이번 포스팅은 파이썬의 packing, unpacking 기법에 대해 공부한 내용을 정리한 것입니다.

 

파이썬을 보다 편리하게 만들어주는 기술 중 하나인데요, 알고 있으면 코드를 더 간결하게 짤 수 있게 됩니다.


Packing

패킹의 경우 *를 사용하여 수행할 수 있습니다.

numbers = [1,2,3,4,5]
a, *b, c = numbers

print(a)  # 1
print(b)  # [2, 3, 4]
print(c)  # 5

 

위와 같이 b에 *를 붙이게 되면, *b는 직접 변수로 명시된 a, c를 제외한 나머지 원소들을 모두 리스트로 패킹하여 할당 받게 됩니다.


Unpacking

언패킹의 경우 일반적으로 *, ** 두 가지를 사용합니다.

 

1) *를 활용한 언패킹

def my_func(x, y, z):
    print(x, y, z)

names = ['alice', 'jane', 'peter']
my_func(*names)  # allice jane peter

 

names에 *를 붙여서 my_func() 함수의 인자로 전달하게 되면, names 리스트의 요소를 언패킹하여 x, y, z에 전달됩니다.

 

2) **를 활용한 언패킹

def my_func(x, y, z):
    print(x, y, z)

my_dict = {'x': 1, 'y': 2, 'z': 3}
my_func(**my_dict)  # 1 2 3

 

**의 경우 보통 딕셔너리 형태에 사용합니다.

위와 같이 함수의 인자로 이 형태를 전달하면, 딕셔너리의 키-값 쌍을 언패킹하여 함수의 키워드 인자로 전달됩니다.


Unpacking을 활용한 재미있는 발견

언패킹을 공부하며 이런저런 코드를 써보던 중, 재미있는 발견을 했습니다.

이 기술은 코딩 테스트에 유용하게 쓰일 수 있을 것 같은데요, 지금 바로 공유해보도록 하겠습니다.

 

문제 하나를 내겠습니다.

arr = [1, 2, 3, 4] 라는 리스트의 원소를 "1 2 3 4" 형태로 출력하시오.

 

어떻게 하시겠습니까?

언패킹을 몰랐다면, 저는 이 문제를 아래와 같이 반복문을 활용하여 풀었을 것입니다.

arr = [1, 2, 3, 4]
for x in arr:
    print(x, end=' ')  # 1 2 3 4

 

좋은 방법입니다만, 언패킹을 활용하면 더 간단하게 풀 수 있습니다.

arr = [1, 2, 3, 4]
print(*arr)  # 1 2 3 4

 

놀랍지 않나요?

이게 어떻게 가능한 걸까요?

 

arr를 언패킹하면 ','를 구분자로 하여 각 원소들이 튀어나오게 됩니다.

print() 함수인자가 'x1, x2, x2 ...' 형태로 들어오면 각 원소 사이에 공백을 넣어 출력하는 특징이 있습니다.

이러한 특징 때문에 print(*arr)를 실행하면 공백을 사이에 끼고 arr 내 각 원소들이 출력되는 것이죠.

 

가끔 코딩 테스트에서 공백을 사이에 낀 형태로 결과를 출력해야하는 상황이 생기는데요,

이 때 유용하게 사용될 것 같네요!