더북(TheBook)

파이썬을 처음 사용하는 사람은 이런 상황에서 인덱스와 슬라이싱(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 차이 나는 인덱스로 인한 오류’라고 풀어 썼다. 예를 들어 리스트의 원소 개수를 세거나 어떤 작업을 정해진 수의 덩어리로 처리하기 위해 루프를 돌아야 하는 경우 이런 실수를 저지르기 쉽다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.