为什么每次循环都会调用 append()?

Why append() is called every loop?

我拿到了地砖class:

class Tile:
    tile_pref = {
        "sprites": []
    }
    pos = Vector2(vector_zero)

    def img(self, x, y, tilemap, t):
        return self.tile_pref["sprites"][0]

    def __init__(self, img, pos):
        self.tile_pref["sprites"].append(img)
        self.pos = pos

另一部分裁剪后: src 是有效的字符串路径,spacingtile_sizeoffset 是带有 .x.y 的向量。 self.__tiles__ 是数组。

img = pyglet.image.load(src)
for i in range((img.height - offset.x) // (spacing.x + tile_size.x) + 1):
  for j in range((img.width - offset.y) // (spacing.y + tile_size.y) + 1):
                a = offset.x + (tile_size.x + spacing.x) * j
                b = offset.y + (tile_size.y + spacing.y) * i
                self.__tiles__.append(Tile(img.get_region(a, b, tile_size.x, tile_size.y), Vector2(i, j)))

主要问题是 tile_pref["sprites"] 的长度不是 1,bu 等于所有图块的数量。我该如何解决?


我认为,当我调用 img.get_region 时,它 returns 我对它的 link。因此,只要 link 发生变化,它就会调用 append

这里:

class Tile:
    tile_pref = {
        "sprites": []
    }
    pos = Vector2(vector_zero)

您将 tile_prefpos 定义为 class 属性 - 属于 class 的属性(不...的实例),并在所有实例之间共享。除非被实例属性遮蔽,class 属性也可以通过实例使用(这是您访问方法的方式,它们是 class 属性),所以这里:

def __init__(self, img, pos):
    self.tile_pref["sprites"].append(img)

你实际上是在改变 class 自己的 tile_pref 属性 - 所以你在这里添加的任何内容都将对所有实例可见。

注意下面一行:

    self.pos = pos

创建一个 'pos' instance 属性(您绑定的是名称,而不是变异),它将隐藏 class 属性。

对于它的价值,所有这些都是 clearly and explicitely documented 官方教程 - 所以我建议你停止你正在做的事情,花一天时间(或如果需要,两个)完成 whole 教程,然后返回您的代码。这将为您节省 很多 的时间、痛苦和挫折。