Python开发游戏时列表索引触发IndexError错误是什么原因?
报错原因
你触发越界错误的核心原因有两个:
- 二维数组浅拷贝导致原数组被意外修改
Python中列表的copy()方法是浅拷贝,你的grid是二维列表,referenceGrid = grid.copy()执行后,referenceGrid里的每一行子列表还是和原grid的子列表共享内存。你在函数里执行referenceGrid[y][x] = 69420的时候,原grid里对应的元素也会被同步修改。 - 重复调用查询函数导致第二次查询无结果
你最后一行代码连续两次调用findCoordsFromGrid(2):第一次调用时已经把原grid里的2改成了69420,第二次调用时grid里已经没有值为2的元素,函数返回空列表,你直接取[0]自然触发索引越界。
修复方案
按需选择以下任意一种修改方案即可解决问题:
- 方案1:只调用一次查询函数,缓存结果,避免重复查询
# 只查询一次保存结果,避免重复调用触发问题 head_coords = findCoordsFromGrid(2)[0] head_pixelValues = [gridDict[head_coords[0]], gridDict[head_coords[1]]]
- 方案2:把浅拷贝改成深拷贝,避免修改原数组
首先导入深拷贝方法:
import copy
然后把函数里的referenceGrid = grid.copy()替换为:
referenceGrid = copy.deepcopy(grid)
额外优化建议
你当前查找坐标的写法效率较低,且index()只会返回同一行第一个匹配项的索引,如果你同一行有多个相同值的元素会漏查,推荐直接改成遍历索引+值的写法,不需要额外生成拷贝数组也能正常工作:
def findCoordsFromGrid(gridValue): global grid coordsLst = [] for y, row in enumerate(grid): for x, val in enumerate(row): if val == gridValue: coordsLst.append([x, y]) return coordsLst
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

