【问题标题】:List index out of range - python array error列表索引超出范围 - python 数组错误
【发布时间】:2012-02-14 22:10:35
【问题描述】:

文件“C:\Users\Tom\Desktop\Tetris!\tetris.py”,第 206 行,在 typeSet 中 Globals.blockArray[i].x.append(7) IndexError: 列表索引超出范围

typeSet 中的第 4 行出现上述错误

初始化时:

def main():
    initialize()

def initialize():
    Globals.running = True
    addBlock()

class Globals:
    running = True
    blockArray = []
    blockNum = 0

然后是:

def addBlock():
    Globals.blockArray.append(block())

class block:
    def __init__(self):
        self.id = Globals.blockNum
        Globals.blockNum += 1
        self.x = []
        self.y = []
        self.landed = False
        self.blockType = 1#random.randint(1,6)
        self.typeSet()


    def typeSet(self):
        i = self.id
        if self.blockType == 1:
            #square(i)
            Globals.blockArray[i].x.append(7)
            Globals.blockArray[i].y.append(0)
            Globals.blockArray[i].x.append(7)
            Globals.blockArray[i].y.append(1)
            Globals.blockArray[i].x.append(8)
            Globals.blockArray[i].y.append(0)
            Globals.blockArray[i].x.append(8)
            Globals.blockArray[i].y.append(1)

编辑:添加更多代码并切换它,因此 id 应该从 0 开始。错误代码没有改变

【问题讨论】:

  • 似乎很清楚:无论Globals.blockArray 是什么,它都没有i 成员。
  • 这似乎是第一次失败。初始化时:blockArray = [] 然后 blockNum = 0 然后 def addBlock(): Globals.blockArray.append(block())
  • i 永远不会为 0。您首先将其增加到 1。blockArray[1] 不存在。
  • 啊,等等,Globals.blockArray[i] 应该是您正在处理的 block 对象?那你为什么不直接参考self呢?
  • 谢谢!那解决了它。我最初没有这样的原因是因为排版在课堂之外。但是非常感谢您抓住它!

标签: python arrays


【解决方案1】:

代码不足。该错误告诉您确切的问题。 Globals.blockArrayi 位置没有成员。这就是为什么在可以避免全局变量时不应该使用它们的原因,因为很难确保全局变量中包含预期值。

【讨论】:

    【解决方案2】:

    我不确定,但也许你想这样做

    Globals.blockArray.append(self)
    

    在init函数中,也增加Globals.blockNum赋值给self.id。

    【讨论】:

      【解决方案3】:

      每次创建block 的实例时,Globals.blockNum 都会增加 1,并且self.id 会设置为Globals.blockNum当前值

      稍后(在typeSetself.id 用于索引到Globals.blockArray

      Globals.blockArray 中没有至少self.id + 1 项时会发生错误。

      如果Globals.blockNum 不断增加并且其值被(间接)用于索引Globals.blockArray,这可能会导致错误(除非某些原因导致Globals.blockArray 也继续增长。

      【讨论】:

        【解决方案4】:

        虽然看到上面的代码并没有立即想到,但我会尝试的第一件事是打印 Globals.blockArrayGlobals.blockArray[i] 的内容。

        【讨论】:

          猜你喜欢
          • 2021-05-12
          • 1970-01-01
          • 2016-01-06
          • 2014-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多