본문 바로가기

Python/공부공부

[Python] 패킹(Packing) & 언패킹(Unpacking)

 

* 패킹(Packing) 

여러 개의 값을 하나의 튜플로 패킹.

data = 1, 2, 3
print(data)

# 출력결과 : (1, 2, 3)

=> 여러개의 값을 data 라는 변수에 패킹. 출력결과는 튜플인 것을 확인할 수 있다.

 

 

* 언패킹(Unpacking)

하나의 변수에 묶여 있던 값을 여러 변수에 나눠서 할당. 
(자바스크립트의 구조분해할당과 유사한듯)

a, b, c = data

print(a)  # 출력결과: 1
print(b)  # 출력결과: 2
print(c)  # 출력결과: 3

=> data 튜플에 담겨있던 값들을 각각 a, b, c라는 변수에 언패킹.

언패킹 변수의 갯수와 데이터(튜플, 리스트 등) 갯수를 맞춰줘야함!!

 


 

파이썬은 여러개의 값을 return하면 자동으로 튜플로 묶어버린다. (패킹)

def get_info():
    return "Alice", 25, "Engineer"

result = get_info()  # 튜플로 반환!!!
print(result)  	# ('Alice', 25, 'Engineer')

=> 따라서 return한 개별값들을 활용하고 싶다면 개별 변수로 언패킹 해줘야함.

name, age, job = get_info()
print(name)  # Alice
print(age)   # 25
print(job)   # Engineer

 


 

언패킹 없이 하나의 튜플로 전달해서 사용하면 타입오류발생.

def print_info(name, age, job):
    print(f"Name: {name}, Age: {age}, Job: {job}")

print_info(get_info())  # TypeError 발생

=> get_info 의 반환값은 튜플이지만 print_info의 인자는 세개!

 


 

개별 변수에 담아서 전달하거나 
아래처럼 *을 사용하면 자동으로 언패킹 해준다.

print_info(*get_info())

# print_info("Alice", 25, "Engineer")  --> 자동언패킹
# 출력결과  Name: Alice, Age: 25, Job: Engineer

 


 

리스트에서도 언패킹 가능

data = ["Python", "JavaScript", "C++"]
a, b, c = data 
print(a)  # Python
print(b)  # JavaScript
print(c)  # C++

 

아래처럼 일부만 언패킹도 가능.

first, *middle, last = [1, 2, 3, 4, 5]
print(first)   # 1
print(middle)  # [2, 3, 4]
print(last)    # 5

* 는 하나의 변수에만 사용 가능!!