Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬에서 범위를 벗어난 슬라이싱 인덱스가 오류 없이 작동하는 이유

파이썬에서 시퀀스(리스트, 문자열, 튜플 등 내장 자료형)를 다룰 때 인덱싱슬라이싱은 서로 다른 방식으로 동작합니다. 이 차이를 이해하면 범위를 벗어난 인덱스가 왜 슬라이싱에서는 오류를 발생시키지 않는지 명확하게 알 수 있습니다.

인덱싱과 슬라이싱의 근본적인 차이

인덱싱(Indexing)은 시퀀스에서 단일 항목 하나를 반환합니다. 따라서 존재하지 않는 위치에 접근하려고 하면 반환할 값이 아예 없기 때문에 IndexError가 발생합니다.

반면 슬라이싱(Slicing)은 항목들로 이루어진 부분 시퀀스(subsequence)를 반환합니다. 요청한 범위가 시퀀스의 실제 크기를 벗어나더라도, 파이썬은 해당 범위와 겹치는 부분이 있으면 그 일부를 반환하고, 겹치는 부분이 전혀 없다면 단순히 빈 시퀀스를 반환할 뿐입니다.

범위를 벗어난 슬라이싱 예제

>>> s = [1, 2, 3]
>>> s[5:8]
[]

리스트 s에는 인덱스 0, 1, 2만 존재하지만, s[5:8]은 오류 없이 빈 리스트 []를 반환합니다. 요청한 범위 [5, 8)이 실제 데이터와 겹치지 않기 때문입니다.

범위를 벗어난 인덱싱 예제

반면 단순 인덱싱으로 존재하지 않는 위치에 접근하면 즉시 오류가 발생합니다.

>>> s = [1, 2, 3]
>>> s[5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

왜 이렇게 설계되었을까?

이러한 동작은 의도적인 설계 선택입니다. 슬라이싱은 주로 부분 집합을 추출하거나 복사본을 만드는 데 사용되므로, 경계를 넘어선 요청에 대해 유연하게 동작하는 것이 편리합니다. 예를 들어 다음과 같은 코드가 안전하게 동작합니다.

>>> s = [1, 2, 3]
>>> s[1:100]   # 끝 인덱스가 커도 자동으로 잘림
[2, 3]
>>> s[:5]      # 처음부터 끝까지
[1, 2, 3]

파이썬은 내부적으로 슬라이스의 시작과 끝 인덱스를 시퀀스 길이에 맞춰 자동으로 잘라내기(clamping) 처리하기 때문에, 프로그래머가 매번 길이를 검사할 필요가 없습니다. 반면 인덱싱은 "정확히 그 위치의 값"을 요구하는 연산이므로, 잘못된 접근을 조용히 통과시키는 대신 명확한 오류로 알려주는 것이 버그를 조기에 발견하는 데 도움이 됩니다.

참고: 음수 인덱스와 step

슬라이싱은 음수 인덱스와 step 값도 지원하며, 이 경우에도 같은 원리가 적용됩니다.

>>> s = [1, 2, 3]
>>> s[-10:]    # 음수 시작점도 길이에 맞춰 처리됨
[1, 2, 3]
>>> s[::-1]    # 역순 슬라이싱
[3, 2, 1]

정리

  • 인덱싱: 단일 값을 반환하며, 범위를 벗어나면 IndexError 발생
  • 슬라이싱: 부분 시퀀스를 반환하며, 범위를 벗어나도 오류 없이 가능한 만큼 또는 빈 시퀀스 반환
  • 이는 파이썬이 슬라이스 경계를 자동으로 클램프(clamp) 처리하도록 설계했기 때문