about me



< June 2005 >
    1 2 3 4
5 6 7 8 91011

past articles »

Click for San Francisco, California Forecast

San Francisco, USA


Python's half open index notation

Beginner programmers often wonder about Python's sequence indexing and slicing notation. Array index starts from 0. Slicing uses half open notations, where L[a:b] is a subsequence with index x where a <= x < b.

Why is the endpoint excluded? Isn't it more intuitive if array index starts from 1 and the endpoint is included, so that a 3 elements array is referenced as L[1:3] with items L[1], L[2], L[3]?

It turns out this notation is an elegant and deliberate design and it has some excellent properties.

We write programs to operate on arrays, to find their length, traverse the subsequences, split them or join them. The half open notation always show a simple pattern. But the inclusive notation often requires adding 1 or substracting 1 to the indexes in many operations. Thus it is more vulnerable to off-by-one-error. This article One True Way of array indexing discuss this at length. I have reproduce its example (with corrections) below:

Operation Half open Inclusive
length of a slice L[a:b] b-a (b-a+1)
first n characters of L L[:n] L[1:n]
last n characters of L L[-n:] L[len(L)-n+1:]
The identity slice L == L[0:len(L)] == L[:] L[1:len(L)]
The empty slice L[a:a] is empty for any a. perhaps L[a:a-1]?
A slice of length n, from point a L[a:a+n] L[a:a+n-1]
Split L[a:b] at index c L[a:b] == L[a:c]+L[c:b] L[a:c-1]+L[c:b]

Another important property is an empty sequence can be expressed by L[a:a], while there is no natural way to express an empty sequence with the inclusive notation. But do we really need to care about a special case? Absolutely! In fact failure to account for empty input is one of the most common error. Just like zero is a fundamental concept in mathematics, always think how you program can handle null input. An inferior approach is to represent empty sequence by None or null pointer. This creates a special case so that a variable need to be tested before dereferencing. Failure to do so contributes to unexpected exceptions. It is an elegant design that L[a:b] can also represent sequences with 0 length.

C++'s STL also choose this notation to represent a range. According to the literature this is crucial because "algorithms that operate on n things frequently require n+1 positions. Linear search, for example (find) must be able to return some value to indicate that the search was unsuccessful." I have seen so many people flunked link list or data structure exercises because they have trouble dealing with the end of a list. Often a good solution is shift the focus beyond the n concrete objects to the n+1 positions around them. I hope this help to make sense of the half open notation.

2005.06.16 [, ] - comments



blog comments powered by Disqus

past articles »


BBC News


Ukraine war: Explosions rock Russian base in Ukraine's Crimea (16 Aug 2022)


Afghan contractors: 'I wish I'd never worked for the UK government' (16 Aug 2022)


Scott Morrison: Ex-Australia PM held five additional portfolios, Albanese says (16 Aug 2022)


New Zealand: Human remains found in suitcase bought at auction (16 Aug 2022)


Norway bridge collapse: Drivers of two vehicles rescued (15 Aug 2022)


Five men held in Ukraine deny being mercenaries (16 Aug 2022)


Sacheen Littlefeather: Oscars apologises to actress after 50 years (16 Aug 2022)


Kenya election result: William Ruto victory hailed amid result dispute (16 Aug 2022)


Trump warrant: Prosecutors oppose releasing search evidence (16 Aug 2022)


Body found in world's highest battlefield 38 years on (16 Aug 2022)

more »


SF Gate


These were the highest-paying Silicon Valley tech companies in 2021 (19 Jul 2022)


'This will be somewhat painful': Elon Musk talks Twitter takeover in extended interview at TED2022 Vancouver (14 Apr 2022)


Best Background Check Services in 2022, Top 13 People Finder Sites Reviewed (5 Apr 2022)


Better.com employees got severance checks before they were laid off (9 Mar 2022)


Apple joins other Bay Area tech giants in responding to Russian invasion of Ukraine (1 Mar 2022)


Uber will now show you how you’re rated by drivers (18 Feb 2022)

more »

Site feed Updated: 2022-Aug-16 03:00