python类属性troub

2024-06-17 11:23:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

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实例,这是一个具有xy属性的tile实例的2d数组,对应于tile坐标。像0:0, 1:0, 2:0, ...

问题是,在上面的测试中,我所有的tile最后都有一个x属性xsize-1,9。这是完全令人困惑的,因为在以#CHECKPOINT为标志的时刻,一切都是正确的,所有的瓷砖都有其实际坐标作为xy属性。我的可视化方法也没有问题

我欢迎任何有助于解开这个谜团的提示。任何关于更有效地实现我的目标(即为单元格分配坐标)的建议,我们也将不胜感激

此外,如果有人读到这篇文章时觉得“这家伙到底在干什么”,我会非常感激任何关于如何处理简单地图生成的合理建议,这是我在本案例中的最终目标。我这样做是为了找到一种方法,通过坐标来寻址与另一个磁贴相邻的磁贴,但我的方法感觉相当不理想


Tags: 方法inselfmapfor属性valuecell
1条回答
网友
1楼 · 发布于 2024-06-17 11:23:01

这一行没有达到您的预期:

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)]

相关问题 更多 >