Why numbering should start at zero
In Python, range()
defines all integers in a half-open interval. So range(2, 10)
means, speaking mathematically, [2, 10)
. Or, speaking Python, [2, 3, 4, 5, 6, 7, 8, 9]
.
Despite asymmetry, that is not a mistake nor an accident. It makes perfect sense since it allows you to glue together two adjacent intervals without risk of one-off errors:
[a, c) = [a, b) + [b, c)
Compare to closed intervals that feel more “natural”:
[a, c] = [a, b] + [b+1, c]
This is also a reason for indexing to start from zero: range(0, N) has exactly N
elements.
Dijkstra wrote an excellent article on the subject back in 1982.