슬라이싱 할 때 [start : end : stride] 와 같이 시작인덱스, 끝 인덱스 외에도 일정한 간격을 두고 슬라이싱을 할 수 있는 특별한 구문을 제공한다.
x = ['빨강', '주황', '노랑', '초록', '파랑', '자주']
odds = x[::2]
evens = x[1::2]
print(odds)
print(evens)
>>>
['빨강', '노랑', '파랑']
['주황', '초록', '자주']
스트라이드를 사용한 구문은 종종 예기치 못한 동작이 일어나서 버그를 야기할 수 있다. 예를 들면 문자열을 역으로 뒤집는 과정에서 오류가 발생한다.
x = b'mongoose'
y = x[::-1]
print(y)
>>>
b'esoognom'
x = '寿司'
y = x[::-1]
print(y)
>>>
司寿
위와 같이 bytes문자열이나 유니코드 문자열은 문자열을 뒤집는 것이 가능하다 하지만 유니코드 데이터를 UTF-8로 인코딩한 문자열에서는 이 코드가 작동하지 않는다
w = 寿司
x = w.encode('utf-8')
y = x[::-1]
z = y.decode('utf-8')
>>>
Traceback ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb8 in position 0: invalid start byte
+) UTF-8 인코딩 문자열은 2바이트 이상으로 이루어져 있다. 그러므로 순서를 뒤집으면 기존 코드가 깨지고 이를 디코딩할 수는 없다. 단 아스키 코드에 해당하는 글자들은 모두 UTF-8로 인코딩 해도 아스키 코드와 같은 1바이트 값으로 인코딩되므로 순서를 뒤집어도 문제가 생기지 않는다.
w = 'abcZYX123'
x = w.encode('utf-8')
y = x[::-1]
z = y.decode('utf-8')
print(z)
>>>
'321XYZcba'
y = x[::2]
z = y[1:-1]