하나 이상의값을 튜플로 묶는 행위
ex)
info = ('hong', 20031225)
'홍' 이라는 사람의 이름과 생년월일을 튜플로 묶었다
용어를 몰라서 그렇지 다들 아무렇지 않게 사용하고 있었을 것이다.
이것을 튜플 패킹 이라고 부른다
튜플에 묶여 있는 값들을 풀어내는 행위
name, birth = info
info라는 패킹되어 있는 튜플을 언패킹 하여 각각 변수에 값을 넣어줌
nums = (1,2,3,4,5)
위 튜플의 5개의 값들을 변수 5개를 만들어 각각 넣지 않고 값 여러개를 리스트로 묶고 싶다면 아래와 같이 하면 된다.
n1, n2, *others = nums
print(n1, n2, others, sep = ' ,')
>> 1 ,2 ,[3, 4, 5]
위와 같이 둘 이상의 값을 리스트로 묶고 싶다면 *를 사용한다.
사실 이 글을 쓰게 된 계기이다.
여기서 꽤나 헤맸었기 때문에 내용을 정리하고자 글을 쓰게 되었다
아래 코드를 보고 차이점을 찾아보자.
def show_nums(n1, n2, *others):
print(n1, n2, others, sep=' , ')
nums = (1,2,3,4,5)
show_nums(*nums)
>> 1 , 2 , (3, 4, 5)
nums = (1,2,3,4,5)
n1, n2, *others = nums
print(n1, n2, others, sep=' , ')
>> 1 , 2 , [3, 4, 5]
조금 이상한 점이 보인다.
분명 리스트로 묶을 때 *를 사용한다고 배웠다.
근데 첫 번째 코드에서는 왜 튜플로 묶이는가?
함수의 *args는 항상 튜플(tuple) 로 수집된다.
이렇게 설계된 이유는 아래와 같다
-함수 인자는 불변이 안전함
-튜플은 호출 비용이 싸다
-튜플은 “읽기 전용 데이터 묶음” 의미에 맞다
조금 더 설명하자면
tuple 대비 list는 크기 변경 가능하고 메모리 재할당 자주 발생한다.
그렇기 때문에 관리 로직들이 많고 크기가 늘어날 것(append 등)을 대비해서 여유 공간(capacity)를 가지고 있다.
구조적으로 tuple 대비 꽤나 무겁다.
그리고 함수 인자의 본질은 데이터를 처리하기 위해 받는 것이지 저장하거나 편집하기 위한 수단이 아니기 때문에 tuple로 패킹 하는 것이다.
이것이 파이썬 구조임
함수 인자로 받아서 패킹할 때에는 무조건 튜플로 패킹된다
문법 공부를 하려고 책을 폈는데 이상하게 책에 있지도 않은 언어 구조나 철학까지 파고들게 되는 것 같다.
때문에 공부시간이 배로 늘어나게 되는데 이게 비효율적인 공부 방식인지 아니면 잘 하고 있는 건지 헷갈린다.