Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > populating a doubly-subscripted array

Reply
Thread Tools

populating a doubly-subscripted array

 
 
ghw@accutrol.com
Guest
Posts: n/a
 
      11-08-2010
What am I missing? I am using Python 3.1.2.

ff = [[0.0]*5]*5
ff #(lists 5x5 array of 0.0)
for i in range(5):
for j in range(3):
ff[i][j] = i*10+j
print (i,j,ff[i][j]) # correctly prints ff array values

ff # try this and see what happens!

result of first print of ff
[[0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0]]

result of second print of ff
0 0 0
0 1 1
0 2 2
1 0 10
1 1 11
1 2 12
2 0 20
2 1 21
2 2 22
3 0 30
3 1 31
3 2 32
4 0 40
4 1 41
4 2 42

result of third print of ff
[[40, 41, 42, 0.0, 0.0], [40, 41, 42, 0.0, 0.0],
[40, 41, 42, 0.0, 0.0], [40, 41, 42, 0.0, 0.0],
[40, 41, 42, 0.0, 0.0]]

Obviously there is something missing in my understanding of
how array values are populated. Why do all "rows" get
populated with the same set of values (40, 41, 42)?

Thanks for your help,
Hamilton Woods

 
Reply With Quote
 
 
 
 
Mark Wooding
Guest
Posts: n/a
 
      11-08-2010
http://www.velocityreviews.com/forums/(E-Mail Removed) writes:

> What am I missing? I am using Python 3.1.2.
>
> ff = [[0.0]*5]*5
> ff #(lists 5x5 array of 0.0)
> for i in range(5):
> for j in range(3):
> ff[i][j] = i*10+j
> print (i,j,ff[i][j]) # correctly prints ff array values
>
> ff # try this and see what happens!
>
> result of third print of ff
> [[40, 41, 42, 0.0, 0.0], [40, 41, 42, 0.0, 0.0],
> [40, 41, 42, 0.0, 0.0], [40, 41, 42, 0.0, 0.0],
> [40, 41, 42, 0.0, 0.0]]
>
> Obviously there is something missing in my understanding of
> how array values are populated. Why do all "rows" get
> populated with the same set of values (40, 41, 42)?


[I suppose that the trailing 0.0 entries aren't in question: they're
because the individual rows have width 5 -- from `[0.0]*5' -- but only
the first three items of each is initialzed -- because j iterates only
over range(3).]

So, why do they all come out the same? The answer is because in fact
there are only two lists involved. You probably thought that you were
building something like the thing on the left. In fact, you have the
thing on the right. (Try to forgive the rubbish ASCII art.)

.--. .--.--.--.--.--. .--.
| ----->| | | | | | | --.
|__| `--^--^--^--^--' |__| \
| | .--.--.--.--.--. | | \
| ----->| | | | | | | ---. \
|__| `--^--^--^--^--' |__| \v
| | .--.--.--.--.--. | | \.--.--.--.--.--.
| ----->| | | | | | | ----->| | | | | |
|__| `--^--^--^--^--' |__| /`--^--^--^--^--'
| | .--.--.--.--.--. | | / ^
| ----->| | | | | | | --' /
|__| `--^--^--^--^--' |__| /
| | .--.--.--.--.--. | | /
| ----->| | | | | | | --'
`--' `--^--^--^--^--' `--'

What [x] * n does is make a list, whose length is n, and all of whose
entries are precisely the value x. If x itself is a list, then you get
an outer list all of whose entries are the /same/ inner list -- not
copies of it. So when you appear to change entries in one of the inner
lists, all the other inner lists seem to change too -- because they're
actually the same list.

-- [mdw]
 
Reply With Quote
 
 
 
 
Mark Wooding
Guest
Posts: n/a
 
      11-09-2010
Gregory Ewing <(E-Mail Removed)> writes:

> A reasonably elegant way to fix this is to use list comprehensions
> for all except the innermost list:
>
> ff = [[0.0]*5 for i in xrange(5)]


Yes, this is a good approach. I should have suggested something like
this as a solution myself, rather than merely explaining the problem.

> If you're computing heavily with arrays, you might also consider
> using numpy arrays instead of lists.


Also a good idea.

-- [mdw]
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
populating a 2D array question Zach C Programming 14 12-10-2010 01:40 AM
Populating Array In a Procedure pessenm VHDL 1 06-16-2008 02:19 PM
Populating an Array of Struct Michael R. Copeland C++ 2 04-19-2006 04:08 AM
Populating Javascript array from vb.net MW ASP .Net 4 04-29-2004 06:09 AM
Populating array with color values Roger ASP .Net 2 01-26-2004 02:13 AM



Advertisments