brain stuck. whats occurring here?

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Thu Feb 7 16:13:39 EST 2008


En Thu, 07 Feb 2008 16:16:11 -0200, mensanator at aol.com  
<mensanator at aol.com> escribió:
> On Feb 7, 11:38 am, Matthew_WAR... at bnpparibas.com wrote:

> I don't see why you should get either.
>
> Especially considering this behaviour:
>
>>>> a=[]
>>>> row=[ [] for n in range(0,10) ]
>>>> a.extend(row[:])
>>>> a
> [[], [], [], [], [], [], [], [], [], []]
>>>> a[0].extend(row[:])
>>>> a
> [[[...], [], [], [], [], [], [], [], [], []], [], [], [], [], [], [],
> [], [], []]

Those [...] should give a clue. Usually Python doesn't "shorten" a list  
representation: if it takes a thousand lines to output a list, there will  
be a thousand lines of output. The [...] means that the list is  
*recursive*: it has an element that refers to the list itself, so it can't  
be represented in the normal way.
Why is it recursive? row[:] is a new list, not the same object as row. It  
is a copy - but a "shallow" copy, because their elements aren't copies  
themselves. So row[0] is the same object as row[:][0]

>>> x = row[:]
>>> x == row
True
>>> x is row
False
>>> x[0] is row[0]
True

In the line a[0].extend(row[:]), a[0] is THE SAME LIST as row[:][0], the  
first item you are appending. That is, the first thing extend() does is  
conceptually a[0].append(a[0]) - and you got a recursive structure.

> Bug in IDLE?

No, just a misunderstanding of what [:] does, I presume.

-- 
Gabriel Genellina




More information about the Python-list mailing list