슬라이싱 구문의 기본 형태: 리스트[시작:끝]
시작 인덱스의 원소는 슬라이스에 포함되지만 끝 인덱스의 원소는 포함 X
a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
print('가운데 두개: ', a[3:5])
print('마지막을 제외한 나버지:', a[1:7])
리스트의 맨앞/끝까지 슬라이싱할 때 쓸데없이 끝 인덱스를 적지 말라 (ㄷ ㄷ)
assert a[:5] == a[0:5]
assert a[5:] == a[5:len(a)]
슬라이싱할 때 리스트의 인덱스 범위에 넘어가는 시작과 끝 인덱스는 무시됨
그러나, 인덱스 범위 넘어서 원소에 접근할려고 하면 에러남
first_twenty_items = a[:20]
last_twenty_items = a[-20:]
a[20]
>> IndexError: list index out of range
리스트를 슬라이싱한 결과는 완전히 새로운 리스트
b = a[3:]
print('Before: ', b)
b[1] = 99
print('After: ', b)
print('No change:', a)
슬라이싱에서 시작과 끝 인덱스를 모두 생략하면 원래 리스트를 복사한 새 리스트를 얻음
반면, 슬라이싱하지 않은 체로 대입하면 리스트 복사본으로 덮어씀
b = a[:]
assert b == a and b is not a
# 같은 리스트 객체이므로 a 원소를 수정하면 b도 바뀜
b = a
print('Before a', a)
print('Before b', b)
a[:] = [101, 102, 103]
assert a is b # Still the same list object
print('After a ', a) # Now has different contents
print('After b ', b) # Same list, so same contents as a
대입시 슬라이드를 사용하면 원본 리스트에서 지정한 범위에 들어 있는 원소를 변경함
리스트에 지정한 슬라이스 길이보다 대입되는 배열 길이가 짧아서 리스트가 줄어드는 경우
print('Before ', a)
a[2:7] = [99, 22, 14]
print('After ', a)
대입되는 길이가 길어서 리스트가 늘어나는 경우
print('Before ', a)
a[2:3] = [47, 11]
print('After ', a)