파이썬을 처음 사용하는 사람은 이런 상황에서 인덱스와 슬라이싱(Better way 11: ‘시퀀스를 슬라이싱하는 방법을 익혀라’ 참고)을 자주 사용한다. 예를 들어, 다음은 원소가 최소 두 개 이상 들어 있는 리스트에서 가장 오래된 자동차와 두 번째로 오래된 자동차의 나이를 가져오는 코드다.
oldest = car_ages_descending[0] second_oldest = car_ages_descending[1] others = car_ages_descending[2:] print(oldest, second_oldest, others) >>> 20 19 [15, 9, 8, 7, 6, 4, 1, 0]
이 코드는 잘 작동하지만 모든 인덱스와 슬라이스로 인해 시각적으로 잡음이 많다. 실제로 이런 식으로 시퀀스의 원소를 여러 하위 집합으로 나누면 1 차이 나는 인덱스로 인한 오류(off-by-one error)4를 만들어내기 쉽다. 예를 들어 어느 한 줄에서 범위를 변경했는데 다른 줄을 깜빡하고 고치지 않으면 결과가 잘못되거나 예외가 발생할 수 있다.
4 역주 3 이상 6 이하인 폐구간의 원소 개수는? 크기가 20인 리스트의 마지막 원소의 인덱스는? 13명을 네 명씩 그룹으로 만들 때 전체 그룹 숫자는? 이런 식으로 개수를 따질 때 실수로 정답에 비해 1이 더 많거나 적은 답을 내놓는 경우가 있다. 이런 오류를 영어로 off-by-one-error라 하는데, 우리말로는 어쩔 수 없이 ‘1 차이 나는 인덱스로 인한 오류’라고 풀어 썼다. 예를 들어 리스트의 원소 개수를 세거나 어떤 작업을 정해진 수의 덩어리로 처리하기 위해 루프를 돌아야 하는 경우 이런 실수를 저지르기 쉽다.