Effective Python C2. List와 Dictionary - 시퀀스 슬라이싱

3 분 소요

Introduction

시퀀스 객체를 슬라이싱하는 일은 매우 자주 있다. 슬라이싱을 효율적으로 하기 위한 기본적인 지식들을 배워본다.

Best WAY 11 : 시퀀스를 슬라이싱하는 방법을 익혀라

슬라이싱으로 원하는 최대길이의 설정

슬라이싱 시에 리스트의 인덱스 범위를 넘어가는 시작과 끝 인덱스는 무시된다. 따라서 슬라이싱만 써도 시퀀스 객체의 최대길이를 설정할 수 있다. top_five_old_man = man[:5] last_five_young_man = man[-5:]

리스트 슬라이싱 : 얕은 복사

리스트 슬라이싱은 얕은 복사가 가능하며, mutable 객체가 이중으로 되어있지 않는 한, 원본과 상관없이 값에 의한 복사가 가능하다.

b = [1, 2, 3, 4, 5]
c = [[1, 2], [3, 4]]
a = b[:] # b를 얕은 복사. 
b[0] = 3
print(a) # 결과는 [1, 2, 3, 4, 5]

d = c[:] # c를 얕은 복사
c[1] = 4 # immutable 객체를 할당하면서 주소값도 변경 
print(d) # 결과는 [[1, 2], [4]]
c[0].append(5) # c 객체 내부의 mutable 객체를 변경
print(c) # 결과는 [[1, 2, 5], 4]

시퀀스의 길이가 달라도 대입이 가능

슬라이스와 대입할 시퀀스가 길이가 달라도 된다.

  • 슬라이스가 대입될 시퀀스보다 더 길 경우, 그만큼 원소가 줄어든다.
  • 반대로 슬라이스가 대입될 시퀀스보다 더 짧은 경우. 그만큼 원소가 삽입된다.
    a = list(range(10))
    a[2:5] = [0] * 2 # 슬라이스 길이가 더 긴 경우
    print(a) # 리스트 길이가 줄어든다. [0, 1, 0 ,0, 5, 6, 7, 8, 9]
    a[2:5] = [100] * 5 # 슬라이스 길이가 더 짧은 경우
    print(a) # 리스트 길이가 늘어난다. [0, 1, 100, 100, 100, 100, 100, 6, 7, 8, 9]
    

Discussion

  • 시퀀스 객체가 아니라 직접 만든 클래스도 슬라이싱할 수 있는데 이를 위해서는 __getitem__과 __setitem__을 구현하자.
  • 시퀀스 길이가 달라도 대입이 가능하나, 예상치 못하게 리스트 길이가 바뀌면 디버깅이 어려워지므로, 의도한 것이 아니라면 길이는 맞추는 것이 좋을 거 같다.

Summary

  • 슬라이싱할 때는 간결하게. 시작과 끝 인덱스가 불필요하면 넣지 말라.
  • 범위를 넘어가는 시작 및 끝 인덱스도 허용된다.
  • 슬라이싱 길이와 대입할 시퀀스의 길이가 달라도 된다.

Reference

파이썬 코딩의 기술 제 2판. - 브렛 슬리킨 지음 / 오현석 옮김