2

Very simple code nested example:

All the code does is create a list of lists that is initialized to zero. It iterates through the list rows and columns and each position is given a value. For some reason the last row of the 2D list is duplicated for each row when the final vector is printed.

Number_of_channels=2
Coefficients_per_channel=3
coefficient_array=[[0]*Coefficients_per_channel]*Number_of_channels 
print coefficient_array
for channel in range(Number_of_channels):
 for coeff in range(Coefficients_per_channel):
 coefficient_array[channel][coeff]=coeff*channel
 print coefficient_array[channel][coeff]
print coefficient_array

Output:

[[0, 0, 0], [0, 0, 0]]
0
0
0
0
1
2
[[0, 1, 2], [0, 1, 2]]

I actually expect:

[[0, 0, 0], [0, 1, 2]]

Anyone have any idea how come this is happening?

asked May 31, 2012 at 9:23

3 Answers 3

5

You only duplicate the outer list, but the values of that list are left untouched. Thus, all (both) outer lists contain references to the same inner, mutable list.

>>> example = [[1, 2, 3]]
>>> example *= 2
>>> example
[[1, 2, 3], [1, 2, 3]]
>>> example[0][0] = 5
[[5, 2, 3], [5, 2, 3]]
>>> example[0] is example[1]
True

Better create the inner lists in a loop:

coefficient_array=[[0]*Coefficients_per_channel for i in xrange(Number_of_channels)]

or, illustrated with the python prompt again:

>>> example = [[i, i, i] for i in xrange(2)]
>>> example
[[0, 0, 0], [1, 1, 1]]
>>> example[0][0] = 5
>>> example
[[5, 0, 0], [1, 1, 1]]
>>> example[0] is example[1]
False
answered May 31, 2012 at 9:26
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for this, I understand now. Holy crap, python is powerful.
1

With

coefficient_array=[[0]*Coefficients_per_channel]*Number_of_channels

you do a duplication of references to the same object:

coefficient_array[0] is coefficient_array[1]

evaluates to True.

Instead, build your array with

[[coeff*channel for coeff in range(Coefficients_per_channel)] for channel in range(Number_of_channels)]
answered May 31, 2012 at 9:39

Comments

0

Try this instead:

coefficient_array=[0]*Number_of_channels 
print coefficient_array
for channel in range(Number_of_channels):
 coefficient_array[channel] = [0] * Coefficients_per_channel
 for coeff in range(Coefficients_per_channel):
 coefficient_array[channel][coeff]=coeff*channel
 print (channel, coeff)
 print coefficient_array[channel][coeff]
print coefficient_array
answered May 31, 2012 at 9:31

1 Comment

How about replacing the inner loop with coefficient_array[channel] = range(0, Coefficients_per_channel * channel, channel)?

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.