늘 헷갈리는 슬라이싱과 언패킹의 개념에 대해 정리해보도록 하겠다.
시퀀스를 여러 조각으로 나누는 방법이다.
여기서 시퀀스란 리스트, 튜플, 문자열 등 연속적으로 이어진 자료형을 '시퀀스 자료형'이라고 한다.
슬라이싱은 시퀀스 자료형에만 한정된 것이 아니라, 클래스에서도 추가할 수 있다.
__getitem__
과 __setitem__
특별 메서드를 구현하면 슬라이싱 구현이 됨.
그럼 예제를 보며 슬라이싱을 익혀보자.
a = [1, 2, 3, 4, 5]
a[:] # 전체복사
a[:2] # [1, 2]
a[:-1] # [1,2,3,4] 0부터 -1까지(마지막에서 하나 뺸 값 까지)
a[3:] # [4, 5]
a[-3:] # [3, 4, 5]
a[1:3] # [2, 3, 4]
a[2:-1] # [3, 4]
a[-3:-1] # [3, 4]
a[:20] # [1, 2, 3, 4, 5]
a[20:] # []
a[20] # 에러
print('리스트 a의 주소값 : ', id(a))
print('슬라이상 이후 주소값 : ', id(a[:]))
# 리스트 a의 주소값 : 4341458624
# 슬라이상 이후 주소값 : 4343789184
# 긴 경우
a[2:3] = [99, 88, 77]
# [1, 2, 99, 77, 88, 4, 5]
# 짧은 경우
a[1:5] = [0]
# [1, 0]
a[1:5:2]
# [2, 4]
여기서 스트라이드는 증가값을 의미한다.([시작:끝:증가값])
권장하지 않는 이유는 읽기가 어렵고 의미가 명확해지지 않기 때문이다.
👉 슬라이싱+스트라이드보다는 스트라이딩 후 슬라이싱을 하자.
first, second, *others= a
print(first,second,others)
# 1 2 [3, 4, 5]
변수에 담기지 않은 나머지 값들을 별표식을 이용하여 담을 수 있다.
별표식을 사용하게 되면 항상 리스트로 담기며 없을 경우에는 빈 리스트로 담기게 된다.
a = [1,2]
first, second, *others= a
print(first,second,others)
# 1 2 []
first, *others, second = a
print(first,second,others)
# 1, 5, [2, 3, 4]
*all = a
# 에러
first, *middle, *second_middle, last = a
# 에러