파이썬 역방향 슬라이싱, 끝값 생략과 -1이 다른 이유

이 카테고리 글 목록

전체글 보기

기존 리스트를 역순으로 담은 새 리스트가 필요하면 items[::-1]을 쓰세요. 음수 step에서 끝값을 생략하는 것과 끝값에 -1을 넣는 것은 다릅니다. 생략은 역방향의 기본 끝 경계를 쓰지만, 명시한 -1은 리스트의 마지막 원소 위치로 해석됩니다.

설명용 다섯 항목을 같은 입력으로 비교합니다. 첫 코드 블록만 복사해도 두 결과와 원본을 확인할 수 있습니다.

items = ["A", "B", "C", "D", "E"]
print("stop 생략", items[::-1])
print("stop=-1", items[:-1:-1])
print("원본", items)
stop 생략 ['E', 'D', 'C', 'B', 'A']
stop=-1 []
원본 ['A', 'B', 'C', 'D', 'E']

-1은 ‘맨 앞보다 한 칸 전’이라는 뜻이 아닙니다

슬라이스는 items[start:stop:step] 형태입니다. step=-1이고 시작값을 생략하면 마지막 원소에서 출발합니다. 다섯 항목의 마지막 위치는 인덱스 4입니다.

반면 명시한 음수 인덱스는 리스트 끝을 기준으로 해석합니다. 이 입력에서 stop=-1도 인덱스 4, 즉 "E"의 위치입니다. 슬라이스는 stop 위치의 원소를 포함하지 않으므로, 출발 위치와 끝 경계가 같아진 items[:-1:-1]에는 담을 원소가 없습니다. items[4:-1:-1]로 시작값까지 적어도 이 입력에서는 같습니다.

items[::-1]의 생략된 stop은 마지막 원소를 뜻하지 않습니다. 역방향으로 0번 원소까지 선택할 수 있도록 그 앞쪽까지 열린 기본 경계를 사용합니다. 이 경계를 직접 쓴 음수 인덱스 -1과 같은 것으로 바꾸면 첫 예제처럼 결과가 달라집니다.

0번 원소까지 넣으려면 stop을 생략하거나 None을 쓰세요

items = ["A", "B", "C", "D", "E"]
print("stop=0", items[-1:0:-1])
print("stop 생략", items[-1::-1])
print("stop=None", items[-1:None:-1])
print("일부 구간", items[3:1:-1])
stop=0 ['E', 'D', 'C', 'B']
stop 생략 ['E', 'D', 'C', 'B', 'A']
stop=None ['E', 'D', 'C', 'B', 'A']
일부 구간 ['D', 'C']

stop=0은 0번 위치의 "A"를 제외하므로 "B"까지만 나옵니다. 생략과 None은 음수 step에 맞는 기본 경계를 써서 "A"도 포함합니다. 마지막 줄은 3번의 "D"에서 뒤로 이동해 2번의 "C"까지 고르고, stop인 1번의 "B"는 제외한 결과입니다.

원하는 구간이 비어 있다면 시작값, 끝값이 가리키는 실제 위치, step의 방향을 함께 확인하세요. items[1:3:-1]처럼 1번에서 뒤로 가면서 3번 경계를 향하도록 적으면 빈 리스트입니다. 끝값을 생략한 역순 슬라이스는 원본이 빈 리스트일 때도 []를 반환합니다. 다만 step=0은 빈 결과가 아니라 ValueError입니다.

이 글은 이미 있는 리스트에서 어떤 위치를 선택하는지 다룹니다. 정수 범위를 새로 만드는 range()의 끝값 제외와 음수 step에서도 방향을 확인해야 하지만, 리스트의 명시적 -1이 마지막 위치로 해석되는 규칙을 range의 숫자 경계와 섞지 마세요.

가상 입력은 Windows의 CPython 3.14.3에서 각 코드 블록을 독립 실행했습니다. 끝값 제외·음수 인덱스·step에 따른 생략 경계는 Python의 공통 시퀀스 연산 문서에서 확인할 수 있습니다. 사용자 정의 객체의 별도 슬라이싱 동작까지 시험한 결과는 아닙니다.

이 카테고리의 다른 글

전체글 보기

댓글 남기기