2011-06-25 76 views
-2

我试图初始化列表,并不断收到索引超出范围:Python的错误:列表分配索引超出范围

self.nodes = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]] 

当我运行这段代码:

for i in range(self.rows): 
      for j in range(self.columns): 
       if self.GRID[i][j] == 0: 
        self.walkable.append(Node(j * self.cellSize, i * self.cellSize)) 
        self.isWalkable = True 
       if self.GRID[i][j] == 1: 
        self.unwalkable.append(Node(j * self.cellSize, i * self.cellSize)) 
        self.isWalkable = False 
       if self.GRID[i][j] == 2: 
        self.player = Node(j * self.cellSize, i * self.cellSize) 
        self.isWalkable = True 
       if self.GRID[i][j] == 3: 
        self.npc = Node(j * self.cellSize, i * self.cellSize) 
        self.isWalkable = True 

       self.nodes[i][j] = Node(j, i) 
       self.nodes[i][j].setWalkable(self.isWalkable) 

错误我得到的是:

self.nodes[i][j] = Node(j, i) 
IndexError: list assignment index out of range 
+1

不可能告诉你为什么除非你显示设置self.columns和self.rows的代码,因为其中的一个超出了数组边界。 –

回答

1

什么是Node()这样做呢?

>>> nodes = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]] 
>>> nodes[0][0] = 5 
Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
IndexError: list assignment index out of range 
>>> nodes[0].append(5) 
>>> nodes 
[[5], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []] 
+0

解决了我的问题;当我忙于用C语言思考时,很难适应python;) – nobody

0
self.nodes = [[[]] * self.columns] * self.rows 
+0

这是错误的。结果有一个维度太多,最内层的列表将是相同的(追加到所有附加)。也许你的意思是用空列表作为值来初始化它 - 但这也不会太有用(当它像使用'.append'一样时没有必要,'None'做得更好,因为它不可变且语义上是更合适)。 – delnan

+0

*叹* *我不知道我在想什么,*对不起*。 –

+0

不需要道歉。它可能不正确,但它是一个有用的答案,突出了一个常见的'错误' –

2

分配到列表中存在的索引失败。在你的情况,你正试图分配到一个空列表的指数j

self.nodes = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]] 
# assume i == 0 and j == 0 
self.nodes[i] # refers to the first empty list [] 
self.nodes[i][j] ## does not exist 

考虑与self.nodes[i].append(Node(j, i))

或者更换self.nodes[i][j] = Node(j, i),确保self.nodes被初始化嵌套表由@yi_H

描述

EDIT OK,不是正如所描述的那样。如果你想创建一个二维数组代表你的表,你可以用

self.nodes = [ [None for col in range(self.cols) ] for row in range(self.rows)]