By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
445,876 Members | 1,200 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 445,876 IT Pros & Developers. It's quick & easy.

Help, multidimensional list

P: n/a
Im trying to create a list of lists and for some reason its not working:

class Tile:
_next = { 'n':None, 'ne':None, 'e':None, 'se':None, 's':None,
'sw':None, 'w':None, 'nw':None }
def blankGridCanvas( maxx, maxy ):
grid = []
for y in xrange( 0, maxy ):
yline = []
for x in xrange( 0, maxx ):
t = Tile()
if y != 0:
t._next[ 'n' ] = grid[ y - 1 ][ x ]
t._next[ 'n' ]._next[ 's' ] = t

yline.append( t )
grid.append( yline )

for y in xrange( 0, maxy ):
for x in xrange( 0, maxx ):
print grid[ x ][ y ], grid[ x ][ y ]._next
return grid

now by my reconing this should be a list of lists with each element being
an instance of Tile, and some references being manipulated to point to each
other. But strangly no, its actually a list of lists where each element is
the SAME instance of Tile, so I change one, i change them ALL!

Whats going on and how do I solve it?

Rich
Jul 18 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a
On Sun, 28 Dec 2003 14:27:41 +0000, Crawley
<cr***********@IGetTooMuchSpamAsItIs.com> wrote:
Im trying to create a list of lists and for some reason its not working:

class Tile:
_next = { 'n':None, 'ne':None, 'e':None, 'se':None, 's':None,
'sw':None, 'w':None, 'nw':None }
def blankGridCanvas( maxx, maxy ):
grid = []
for y in xrange( 0, maxy ):
yline = []
for x in xrange( 0, maxx ):
t = Tile()
if y != 0:
t._next[ 'n' ] = grid[ y - 1 ][ x ]
t._next[ 'n' ]._next[ 's' ] = t

yline.append( t )
grid.append( yline )

for y in xrange( 0, maxy ):
for x in xrange( 0, maxx ):
print grid[ x ][ y ], grid[ x ][ y ]._next
return grid

now by my reconing this should be a list of lists with each element being
an instance of Tile,
You only create a *class* Tile, and provide no way to create
*instances* of it - so much like with static variables in other
languages, you only have one 'instance' here. To be able to create
separate instances, you need a constructor in your class to
instantiate every instance, like so:

class Tile:
def __init__(self):
self._next = { 'n':None, 'ne':None, 'e':None, 'se':None,
's':None, 'sw':None, 'w':None, 'nw':None }
and some references being manipulated to point to eachother. But strangly no, its actually a list of lists where each element is
the SAME instance of Tile, so I change one, i change them ALL!

Whats going on and how do I solve it?


Any gurus around can certainly much better explain what's going on and
why...

--
Christopher
Jul 18 '05 #2

P: n/a

"Christopher Koppler" <kl******@chello.at> wrote in message
news:jb********************************@4ax.com...
On Sun, 28 Dec 2003 14:27:41 +0000, Crawley
<cr***********@IGetTooMuchSpamAsItIs.com> wrote:
Im trying to create a list of lists and for some reason its not working:

class Tile:
_next = { 'n':None, 'ne':None, 'e':None, 'se':None, 's':None,
'sw':None, 'w':None, 'nw':None }
def blankGridCanvas( maxx, maxy ):
grid = []
for y in xrange( 0, maxy ):
yline = []
for x in xrange( 0, maxx ):
t = Tile()
if y != 0:
t._next[ 'n' ] = grid[ y - 1 ][ x ]
t._next[ 'n' ]._next[ 's' ] = t

yline.append( t )
grid.append( yline )

for y in xrange( 0, maxy ):
for x in xrange( 0, maxx ):
print grid[ x ][ y ], grid[ x ][ y ]._next
return grid

now by my reconing this should be a list of lists with each element beingan instance of Tile,
You only create a *class* Tile, and provide no way to create
*instances* of it


No, the line 't=Tile()' does create a separate Tile for each grid position.
However, there is only one class attribute shared by all instances.
- so much like with static variables in other
languages, you only have one 'instance' here. To be able to create
separate instances, you need a constructor in your class to
instantiate every instance, like so:

class Tile:
def __init__(self):
self._next = { 'n':None, 'ne':None, 'e':None, 'se':None,
's':None, 'sw':None, 'w':None, 'nw':None }
You do not need __init__ for separate instances, but do need it to give
each instance its own map.
and some references being manipulated to point to each
other. But strangly no, its actually a list of lists where each element isthe SAME instance of Tile, so I change one, i change them ALL!


As stated above, you do have separate instances but only one map attached
to the class instead of a separate map for each instance. Koppler's
__init__ will fix this.

Terry J. Reedy
Jul 18 '05 #3

P: n/a
On Sun, 28 Dec 2003 17:50:07 -0500, "Terry Reedy" <tj*****@udel.edu>
wrote:

"Christopher Koppler" <kl******@chello.at> wrote in message
news:jb********************************@4ax.com.. .
On Sun, 28 Dec 2003 14:27:41 +0000, Crawley
<cr***********@IGetTooMuchSpamAsItIs.com> wrote:
>Im trying to create a list of lists and for some reason its not working:
>
>class Tile:
> _next = { 'n':None, 'ne':None, 'e':None, 'se':None, 's':None,
>'sw':None, 'w':None, 'nw':None }
>
> [snip some code] >
>now by my reconing this should be a list of lists with each elementbeing >an instance of Tile,
You only create a *class* Tile, and provide no way to create
*instances* of it


No, the line 't=Tile()' does create a separate Tile for each grid position.
However, there is only one class attribute shared by all instances.


Yes, thanks for clearing that up. That is what I probably meant and
didn't know how to say. Too merry Xmas this year ;-)
- so much like with static variables in other
languages, you only have one 'instance' here. To be able to create
separate instances, you need a constructor in your class to
instantiate every instance, like so:

class Tile:
def __init__(self):
self._next = { 'n':None, 'ne':None, 'e':None, 'se':None,
's':None, 'sw':None, 'w':None, 'nw':None }
You do not need __init__ for separate instances, but do need it to give
each instance its own map.


I think that's what I meant with the comparison to static variables,
but should have read static class attributes.
and some references being manipulated to point to each
>other. But strangly no, its actually a list of lists where each elementis >the SAME instance of Tile, so I change one, i change them ALL!


As stated above, you do have separate instances but only one map attached
to the class instead of a separate map for each instance. Koppler's
__init__ will fix this.

Terry J. Reedy

--
Christopher
Jul 18 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.