我有以下代码:
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
实例,这是一个具有x
和y
属性的tile实例的2d数组,对应于tile坐标。像0:0, 1:0, 2:0, ...
问题是,在上面的测试中,我所有的tile最后都有一个x
属性xsize-1
,9。这是完全令人困惑的,因为在以#CHECKPOINT
为标志的时刻,一切都是正确的,所有的瓷砖都有其实际坐标作为x
和y
属性。我的可视化方法也没有问题
我欢迎任何有助于解开这个谜团的提示。任何关于更有效地实现我的目标(即为单元格分配坐标)的建议,我们也将不胜感激
此外,如果有人读到这篇文章时觉得“这家伙到底在干什么”,我会非常感激任何关于如何处理简单地图生成的合理建议,这是我在本案例中的最终目标。我这样做是为了找到一种方法,通过坐标来寻址与另一个磁贴相邻的磁贴,但我的方法感觉相当不理想
这一行没有达到您的预期:
尽管它似乎创建了一个列表列表,但实际上您得到的列表包含对同一对象的引用
tile(0)
。所以当你修改canvas[0][0]
时,你也在修改canvas[0][1]
,canvas[0][2]
等等例如:
每个对象都有相同的内存地址,所以它是由五个元素组成的列表,实际上它们都是相同的对象
可以通过显式创建新对象来解决此问题:
相关问题 更多 >
编程相关推荐