Bug with lists of pairs of lists and append()

TeroV teroV at nowhere.invalid
Fri Sep 28 15:54:40 EDT 2007


Gabriel Zachmann wrote:
> Well,
> 
> could some kind soul please explain to me why the following trivial code 
> is misbehaving?
> 
> 
> #!/usr/bin/python
> s = []
> l = [ 0 ]
> r = [0, 0]
> while r:
>     x = (l,r)
>     print x
>     s.append( x )
>     l.append( r.pop(0) )
> print s
> 
> 
> 
> The output I get is:
> 
> ([0], [0, 0])
> ([0, 0], [0])
> [([0, 0, 0], []), ([0, 0, 0], [])]
> 
> and the error is in the last line: the two pairs in the outer list are 
> identical and they should be equal to the pairs one the first and the 
> 2nd line, respectively! Shouldn't they?
> 
> I think I'm going nuts -- for the life of me I don't see what's going on 
> ...
> 
> Thanks a lot in advance for any insights, etc.
> 
> Best regards,
> Gabriel.

You didn't say what it is supposed to do.
But, does replacing line "x = (l, r)" with "x = l[:], r[:]" do the trick?

In the original code you do basically the same as this
 >>> a = []
 >>> b = [1,2]
 >>> a.append(b)
 >>> b.append(3)
 >>> a
[[1, 2, 3]]

HTH :)



More information about the Python-list mailing list