# Explanation of list reference

Christian Gollwitzer auriocus at gmx.de
Sat Feb 15 10:38:22 CET 2014

```Hi Dave,

Am 14.02.14 19:08, schrieb dave em:
> He is asking a question I am having trouble answering which is how a
> variable containing a value differs from a variable containing a list
> or more specifically a list reference.

as others have explained better and in more detail, there are mutable
and immutable values. The point is, that in

a=b

and

a[1] = x

the "=" behaves differently. In the first case, you discard the
reference, where a is pointing to, and bind to the same thing as b is
pointing to. In the second case, you modify the thing that a is pointing
to.

Recently, we tripped upon such a thing in a bad way; we were doing least
squares fitting with numpy, and the parameters passed through were
modified in the residuals function. That caused the LS algorithm to
the parameters

param_copy = param[:]

It still didn't work, because a list behaves differently than a numpy
array in this respect, to our big surprise:

# list slicing, as we know it
>>> a=[1,2,3,4]
>>> b=a[:] # list slicing creates a copy
>>> b[1]=123
>>> b
[1, 123, 3, 4]
>>> a
[1, 2, 3, 4]

# now numpy array slicing
>>> import numpy as np
>>> a=np.array([1, 2, 3, 4])
>>> a
array([1, 2, 3, 4])
>>> b=a[:] # numpy slicing creates a reference
>>> b[1]=123
>>> b
array([  1, 123,   3,   4])
>>> a
array([  1, 123,   3,   4])

Lesson learned: Don't modify parameters you got passed, if possible. It
is rarely what you want and can sometimes even happen, when you know you
don't want it.

Christian

```