2015-03-01 4 views
0

У меня есть следующий код:питона класс недвижимость неприятность

class tile: 
    def __init__(self, value): 
     self.value = value 

class map_2d: 
    def __init__(self, xsize, ysize): 
     self.dimx = xsize 
     self.dimy = ysize 
     self.canvas = [[tile(0)] * xsize for i in range(ysize)] 
     for yc in range(ysize): 
      for xc in range(xsize): 
       self.canvas[yc][xc].x = xc 
       self.canvas[yc][xc].y = yC#CHECKPOINT 

#TEST: 
mymap = map_2d(10, 10) 
for line in mymap.canvas: 
    print ' | '.join('%d:%d' % (cell.x, cell.y) for cell in line) 

я ожидаю, чтобы иметь map_2d экземпляр с .canvas собственности, то есть 2d массив экземпляров плитки с x и y свойств, соответствующих координаты плитки. Как 0:0, 1:0, 2:0, ...

Проблема в том, что в конце концов мои плитки имеют свойство xxsize-1, 9 в вышеприведенном тесте. Это совершенно запутанно, так как в настоящий момент, отмеченный #CHECKPOINT, все правильно, и все плитки имеют свои фактические координаты как x и y. С моим методом визуализации ничего не получается.

Я хотел бы приветствовать любые подсказки, чтобы помочь с этой тайной. Любые предложения о достижении моей цели (которая назначает координаты ячейкам) более эффективно будут оценены.

Кроме того, если кто-либо читает это, похоже, «что, черт возьми, этот парень делает», я был бы благодарен за любые разумные советы о том, как бороться с простым генерированием карты, что является моей конечной целью в этом случае. Я сделал все это, чтобы иметь способ адресовать плитки, прилегающие к другой плите по координатам, но мой подход кажется довольно субоптимальным.

ответ

0

Эта линия не делает то, что вы ожидаете:

self.canvas = [[tile(0)] * xsize for i in range(size)] 

Несмотря на то, что, кажется, чтобы создать список списков, вы фактически получаете списки, которые содержат ссылку на тот же объект tile(0). Поэтому, когда вы изменяете canvas[0][0], вы также изменяете canvas[0][1], canvas[0][2] и так далее.

Например:

>>> [tile(0)] * 5 
[<__main__.Tile instance at 0x10200eea8>, <__main__.Tile instance at 0x10200eea8>, <__main__.Tile instance at 0x10200eea8>, <__main__.Tile instance at 0x10200eea8>, <__main__.Tile instance at 0x10200eea8>] 

Каждый объект имеет один и тот же адрес памяти, так что список из пяти элементов, которые на самом деле все тот же объект.

Вы можете решить эту проблему путем явного создания новых объектов:

self.canvas = [[tile(0) for j in range(xsize)] for i in range(ysize)] 
+0

Да, это выглядит, как он. Спасибо! –

Смежные вопросы