슬라이싱을 사용하면 최소한의 노력으로 시퀀스에 들어있는 아이템의 부분집합을 접근하기 쉽다.
어떤 파이썬 클래스에도 슬라이싱 추가 가능
특별 메서드 구현
슬라이싱 구분: 리스트[시작:끝]
시작 인덱스에 있는 원소는 슬라이스에 포함되지만, 끝 인덱스에 있는 원소는 포함되지 않는다.
a = ['a' , 'b', 'c', 'd', 'e', 'f', 'g', 'h']
print('가운데 2개:', a[3:5] # 가운데 2개: ['d', 'e']
print('마지막을 제외한 나머지:', a[1:7] ) #마지막을 제외한 나머지; ['b','c','d','e','f','g']
assert a[:5] == a[0:5]
assert a[5:] == a[5:len(a)]
a[-3:] # ['f','g','h']
first_twenty_items = a[:20]
last_twenty_items = a[-20:]
리스트를 슬라이싱한 결과는 완전한 새로운 리스트이고, 원래 리스트에 대한 참조는 그대로 유지
슬라이싱한 결과로 얻은 리스트를 변경해도 원래 리스트 바뀌지 않는다.
b = a[3:]
print('이전:', b) #이전: ['d', 'e', 'f', 'g', 'h']
b[1] = 99
print('이후:', b) #이후: ['d',99,'f','g','h']
print('변화 없음:', b) #변화없음: ['a','b','c','d','e','f','g','h']
대입에 슬라이스를 사용할 경우, 원본 리스트에서 지정한 범위에 들어 있는 원소를 변경하고, 언패킹 대입과 달리 슬라이스와 대입되는 리스트의 길이가 같을 필요가 없다.
대입된 슬라이스 이전이나 이후에 있던 원소들은 그대로 유지가되지만, 리스트에 지정한 슬라이스 길이보다 대입되는 배열의 길이가 더 짧기에 리스트가 줄어듭니다.
print('이전:' , a) #이전: ['a','b','c','d','e','f','g','h']
a[2:7] = [99,22,14]
print('이후', a) #이후: ['a','b',99,22,14,'h']
print('이전:', a) #이전: ['a','b',99,22,14,'h']
a[2:3] = [47,11]
print('이후:', a) #이후: ['a','b',47,11,22,14'h']
b = a[:]
assert b==a and b is not a
시작과 끝 인덱스가 없는 슬라이스에 대입하면 슬라이스가 참조하는 리스트의 내용을 대입하는 리스트의 복사본을 덮어 씁니다.
b = a
print('이전 a:', a) #이전 a: ['a','b',47,11,22,14,'h']
print('이전 b:', b) #이후 b: ['a','b',47,11,22,14,'h']
a[:] = [101, 102, 103]
assert a is b #여전히 같은 리스트 객체
print('이후 a:', a) # 새로운 내용이 들어 있음, 이후 a: [101,102,103]
print('이후 b:', b) #같은 리스트 객체이기에 a와 내용이 같음, 이후 b: [101,102,103]
슬라이싱을 간결하게 하라
슬라이싱은 범위를 넘어가는 시작 인덱스나 끝 인덱스도 허용한다.
리스트 슬라이스에 대입하면 원래 시퀀스에서 슬라이스가 가리키는 부분을 대입 연산자 오른쪽에 있는 시퀀스로 대치하고 길이가 달라도 됩니다