python 슬라이싱, 언패킹

hodu·2022년 9월 26일
0

python

목록 보기
5/17
post-thumbnail

늘 헷갈리는 슬라이싱과 언패킹의 개념에 대해 정리해보도록 하겠다.

슬라이싱

시퀀스를 여러 조각으로 나누는 방법이다.
여기서 시퀀스란 리스트, 튜플, 문자열 등 연속적으로 이어진 자료형을 '시퀀스 자료형'이라고 한다.

슬라이싱은 시퀀스 자료형에만 한정된 것이 아니라, 클래스에서도 추가할 수 있다.
__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
# 에러
profile
안녕 세계!

0개의 댓글