Strange behavior related to value / reference
Chris Rebert
clp2 at rebertia.com
Wed Oct 28 03:40:58 CET 2009
On Tue, Oct 27, 2009 at 7:15 PM, Lambda <stephenhsu9 at gmail.com> wrote:
> I defined a function to raise a 2x2 matrix to nth power:
>
> def matrix_power(m, n):
> result = m[:]
Note that this only copies the *outer* list. It does NOT copy any of
the inner, nested lists, it just makes fresh *references* to them,
which is what's causing your problem; the inner lists get shared, thus
the 2D lists are almost the same list for practical purposes.
You want:
result = [row[:] for row in m]
Which explicitly copies the inner lists.
<snip>
> I find the matrix and m lists are always equal.
> But these two lists are separate objects, right?
Right, but the *inner* list objects *are* the same in your code, and
lists with the same contents (in this case, the same inner lists)
compare as equal (==) but not identical (`is`). Remember that all
lists in Python are 1-dimensional; "multidimensional" lists are merely
by convention, hence you have to think a bit more carefully when
working with them.
Cheers,
Chris
--
http://blog.rebertia.com
More information about the Python-list
mailing list