# List of lists: caveat?

Terry Reedy tejarex at yahoo.com
Sat Mar 9 21:46:35 CET 2002

```"George Thomas" <george at cc.gatech.edu> wrote in message
news:Pine.LNX.4.44.0203091505530.12114-100000 at laureloak.cc.gatech.edu.
..
> Hi everyone,

Hi.

> I just tried creating a 2D array the 'list-of-lists' way as follows:
> two_d_array = [ [0] * 20] * 10 # Creates a 10 * 20 array  -- (I)

This creates a list (which I will call 'tda' hereafter) of 10
*identical* references to the *same* inner list object.  And,
similarly, the inner list consists of 20 *identical* references to the
*same* integer object with value 0.  You can verify both statements
with id(object).  You do not notice the inner sameness as much because
a statement such as

> two_d_array[0][3] = 1 # Sets element [0][3] to 1

destroys that sameness, but leaves the outer sameness untouched.

> I expected nothing unnerving, except that
> print two_d_array[1][3]
> gives me 1
> as does print two_d_array[any valid index from 0 to 9][3]

Since tda[0] is tda[1] ... is tda[9] by construction, and you have not
changed it, why would you expect elsewise?  (;<)

If that sameness is not what you want, construct differently:

tda = [None]*10
for i in len(tda): tda[i] = [0]*20

You now have 10 *different* references to 10 identity-different but
value-equal lists, which you can independently modify.  Again, use
id() to check.

Terry J. Reedy

```