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 fail. After we got suspicious about this, we tried to remedy by copying 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
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to