[Tutor] A list in list problem
Dave S
pythontut at pusspaws.net
Mon Aug 21 18:19:35 CEST 2006
On Monday 21 August 2006 13:40, Alan Gauld wrote:
> > So when I needed to make a list of a list in the following code I
> > thought no
> > problem ...
> >
> >
> > def CSV_Lines(self, csv, from_, to):
> > """Returns a list of cleaned up lines from csv 'from_' line
> > number 'to' line number"""
> >
> > clean_line = clean_csv = []
>
> So clean_line is a reference to clean_csv which is a reference
> to a list. That is, both variables point to the same list?
> I don't think thats what you wanted... Remember that Python
> variables are references to objects, in this case they both
> reference the same list object.
In the past I have assigned multiple variables by
var1 = var2 = 0
when one of the variables is assigned a different value, another object is
created and var1 & var2 are separate. Without thinking I tried to do the same
with the two lists.
>>>
>>> a=b=[]
>>> a
[]
>>> b
[]
>>> a=[1,2,3]
>>> a
[1, 2, 3]
>>> b
[]
>>>
Tinkering some more I think it is the append that did it.
>>>
>>> a=b=[]
>>> a
[]
>>> b
[]
>>> a.append([1,2,3])
>>> a
[[1, 2, 3]]
>>> b
[[1, 2, 3]]
>>>
It appended to the common object and did not create a separate one ?
I guess var1 = var2 = 0 is generally bad programming style ?. I keep trying to
get my code more compact using list comprehension etc - in this case compact
got me into trouble.
I have tried looking at some open source projects eg kdissert,sbackup to get
into good codeing habits but they are a bit above me. So I am learning by
trying. (1 x GUI app written, a more advanced one on the way)
Thanks for all your help
Dave
PS This is probably an impossible question but I always struggle to find names
for variables - any hints ?
>
> > print 'clean_line ',clean_line
> > clean_csv.append(clean_line)
>
> So the list has just appended itself to itself, that why python
> shows the slightly wierd [...] because its a recursively defined list.
That sounds bad - and sure confused me !
>
> > print 'clean_csv ',clean_csv
> > clean_line = []
>
> And now you make clean_line point to a new empty list
> So next time round the vcontents ofg the new clean line
> will be appended to the old one.
>
> Go back and initialise your lists as two separate lists and
> you will get what you expect.
>
> > clean_line ['temp1', 'wow a variable']
> > clean_csv ['temp1', 'wow a variable', [...]]
>
> The original with itself tagged on.
>
> > clean_line ['temp2']
> > clean_csv ['temp1', 'wow a variable', [...], ['temp2']]
>
> The above list with the new list added
>
> Just as expected :-)
>
> HTH,
>
> Alan Gauld
> Author of the Learn to Program web site
> http://www.freenetpages.co.uk/hp/alan.gauld
More information about the Tutor
mailing list