#python #list #python-2.7 #exception #indexing
#python #Список #python-2.7 #исключение #индексирование
Вопрос:
Я использую python 2.5 (я знаю, что это старая версия), и я продолжаю получать очень неприятное исключение «Индекс списка вне диапазона». Я работаю над игрой на основе плиток, и ниже приведен код для создания карты, с которой у меня возникли проблемы:
#Creates the list
def setMapSize(self):
l = raw_input('Custom Map length: ')
h = raw_input('Custom Map height: ')
if not(l=='')and not(h==''):
self.length = int(l)
self.height = int(h)
self.tileMap = [[i]*self.length for i in xrange(self.height)]
print self.tileMap
#Load each element of the list from a text file
def loadMap(self,filePath='template.txt'):
loadPath = raw_input('Load the map: ')
if loadPath =='':
self.directory = 'c:/Python25/PYGAME/TileRpg/Maps/' filePath
print 'Loading map from ',self.directory
readFile = open(self.directory,'r')
for y in xrange(self.height):
for x in xrange(self.length):
#reads only 1 byte (1 char)
print '---Location: ',x,y
print self.tileMap
self.tileMap[x][y]=int(readFile.read(1))
print 'Loaded map:',self.tileMap
readFile.close()
print 'Map loadedn'
Вот выходные данные и сообщение об ошибке, которые я получаю, пожалуйста, скажите мне, знаете ли вы, что происходит:
Main began
Map began initialization
Map initialized
Custom Map length: 2
Custom Map height: 5
[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
Load the map:
Loading map from c:/Python25/PYGAME/TileRpg/Maps/template.txt
---Location: 0 0
[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
---Location: 1 0
[[9, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
---Location: 0 1
[[9, 0], [9, 0], [0, 0], [0, 0], [0, 0]]
---Location: 1 1
[[9, 9], [9, 0], [0, 0], [0, 0], [0, 0]]
---Location: 0 2
[[9, 9], [9, 9], [0, 0], [0, 0], [0, 0]]
Traceback (most recent call last):
File "C:Python25PYGAMETileRpgLevelEditorMain.py", line 7, in <module>
class Main():
File "C:Python25PYGAMETileRpgLevelEditorMain.py", line 17, in Main
tileMap.loadMap()
File "C:Python25PYGAMETileRpgMap.py", line 48, in loadMap
self.tileMap[x][y]=int(readFile.read(1))
IndexError: list assignment index out of range
Как вы можете видеть, индекс, которому я присваиваю, кажется, существует, но я все еще получаю эту ошибку.
Комментарии:
1. Исключение вызывает не чтение.
2. Я знаю это, мне пришлось поместить это в заголовок, поскольку у кого-то уже был заголовок, который я собирался использовать. Исключение составляет то, что в нем говорится, что индекс находится вне диапазона.
Ответ №1:
Вы поменяли местами высоту и ширину; внешний список имеет длину height
, а не внутренний. self.tileMap[0]
это список длиной 2, поэтому максимальный индекс, который вы можете использовать для него 1
, не 2
равен.
Замена x
и y
решит эту проблему:
for x in xrange(self.height):
for y in xrange(self.length):
#reads only 1 byte (1 char)
print '---Location: ',x,y
print self.tileMap
self.tileMap[x][y]=int(readFile.read(1))
Здесь вам не нужно использовать индексы, вы можете изменять списки напрямую:
for row in self.tileMap:
row[:] = [readFile.read(1) for _ in row]
Вы можете читать строку за раз:
for row in self.tileMap:
row[:] = map(int, readFile.read(self.length))
Комментарии:
1. Однако замена высоты и длины не решает проблему, я все еще получаю сообщение об ошибке.
2.@user3050810: обратите внимание, что
x
теперь цикл завершенrange(self.height)
, а неself.length
.3. Спасибо, как только я посмотрел на ваш ответ, я изложил проблему на бумаге и понял свою ошибку.