building lists of dictionaries

  • Thread starter Jean_Francois Moulin
  • Start date
J

Jean_Francois Moulin

Hi all,

I tried this piece of code (FWIW, it was taken as is from a help section of mpfit, a mathematical routine for least square fitting):

parinfo = [{'value':0., 'fixed':0, 'limited':[0,0], 'limits':[0.,0.]}]*6
parinfo[0]['fixed'] = 1
parinfo[4]['limited'][0] = 1
parinfo[4]['limits'][0] = 50.

The first line builds a list of six dictionaries with initialised keys.
I expected that the last three lines would only affect the corresponding keys of the corresponding dictionnary and that I would end up with a fully initialised list where only the 'fixed' key of the first dict would be 1, and the first values of limited and limits for dict number 4 would be 1 and 50. respectively....

This is not so!
I end up with all dictionaries being identical and having their 'fixed' key set to 1, and limited[0]==1 and limits[0]==50.

I do not understand this behaviour...

Thanks for helping a newbie.

JF
 
?

=?ISO-8859-1?Q?Ernesto_Garc=EDa_Garc=EDa?=

parinfo = [{'value':0., 'fixed':0, 'limited':[0,0], 'limits':[0.,0.]}]*6

With this, you are creating a list with 6 references to the same list.
Note that the left operand of '*' is evaluated only once before
"multiplying" it six times.

Regards,
Tito
 
R

Rob Williscroft

Jean_Francois Moulin wrote in
in
comp.lang.python:
Hi all,

I tried this piece of code (FWIW, it was taken as is from a help
section of mpfit, a mathematical routine for least square fitting):

parinfo = [{'value':0., 'fixed':0, 'limited':[0,0],
'limits':[0.,0.]}]*6 parinfo[0]['fixed'] = 1
parinfo[4]['limited'][0] = 1
parinfo[4]['limits'][0] = 50.

The first line builds a list of six dictionaries with initialised
keys. I expected that the last three lines would only affect the
corresponding keys of the corresponding dictionnary and that I would
end up with a fully initialised list where only the 'fixed' key of the
first dict would be 1, and the first values of limited and limits for
dict number 4 would be 1 and 50. respectively....

This is not so!
I end up with all dictionaries being identical and having their
'fixed' key set to 1, and limited[0]==1 and limits[0]==50.

I do not understand this behaviour...

This should help:

<url:http://www.python.org/doc/faq/programming/#how-do-i-create-a-
multidimensional-list>

As a TinyUrl: http://tinyurl.com/s8akj

Rob.
 
J

Juho Schultz

Jean_Francois Moulin said:
Hi all,

I tried this piece of code (FWIW, it was taken as is from a help section of mpfit, a mathematical routine for least square fitting):

parinfo = [{'value':0., 'fixed':0, 'limited':[0,0], 'limits':[0.,0.]}]*6
The first line builds a list of six dictionaries with initialised keys.
This is not so!
I end up with all dictionaries being identical and having their 'fixed' key set to 1, and limited[0]==1 and limits[0]==50.

I do not understand this behaviour...

Thanks for helping a newbie.

JF


xvec = [{'value':0}]*6
xids = [id(x) for x in xvec]
print xids

Should print a list of six integers, all equal.
So all elements in your list are the same.

Another way to construct the desired list:

yvec = [{'value':0} for i in range(6)]
yids = [id(y) for y in yvec]
print yids

The elements in this list should be all different.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top