Python's multi-element objects (lists and arrays as far as the
course is concerned) are all zero-offset: the first element is indexed
as `[0]`

. This is also true of C, but not true of Pascal. The
first element of a Pascal array can be an arbitrary index, determined
on the array's declaration. Common choices are `[0]`

and
`[1]`

.

Python's `range`

function which allows the emulation of `for`

loops
in other languages (i.e. allows you to step through a code block,
incrementing some counter by a constant index) is an example of the
``fencepost errors'' novice programmers often
encounter[#!fencepost!#]

In order to generate a list that goes from `0`

to `n`

inclusive one uses `range(0, n + 1)`

(the first argument is
optional; code0 is the default). This returns a list with ```
n
+ 1
```

elements. In the handbook student's are told: ``this may seem
strange but there are reasons''. In fact problems with the
`range`

function itself were surprisingly rare (see
Figure 3.9)

A more common error involved arrays. An array can be created using the
`zeros`

function which takes (at least) on argument: the number
of elements in the array. For example, to create an initialised,
ten-element array of integers one might do `xx = zeros(10)`

,
where `xx`

is the array. It was then common for students to get
confused by fencepost errors and try and step through the elements of
the array using a `for`

loop as follows:

>>> xx = zeros(10) >>> for i in range(0, 11): ... print xx[i], # (the trailing comma suppresses the new line ... # automatically included by print) 0 0 0 0 0 0 0 0 0 0 Traceback (most recent call last): File "<stdin>", line 2, in ? IndexError: index out of bounds

Students appeared to be confusing the fact that the last number
returned by `range(11)`

is `10`

and the index of the last
element of `xx`

, which is `9`

. It is then that the most able
students spotted the reason `range`

works like it does; the
argument given to the `zeros`

function is almost always the same
as the argument given to the `range`

function. Demonstrators
should be aware that, if they see different arguments for `zeros`

and `range`

, the student is probably confused. Of course in this
case the error message is very descriptive.