I';我在Python中得到一个索引错误,说它';它超出范围,但我';我不知道为什么
我已经创建了将机器语言转换为汇编语言的代码,但是当我试图从命令提示符下运行它时,总是会出现错误。我收到的错误是:I';我在Python中得到一个索引错误,说它';它超出范围,但我';我不知道为什么,python,traceback,Python,Traceback,我已经创建了将机器语言转换为汇编语言的代码,但是当我试图从命令提示符下运行它时,总是会出现错误。我收到的错误是: Traceback <most recent call last>: File "Assembler.py", line 102, in <module> parser.advance() File "Assembler.py", line 15, in advance self.command = self.asm_file[
Traceback <most recent call last>:
File "Assembler.py", line 102, in <module>
parser.advance()
File "Assembler.py", line 15, in advance
self.command = self.asm_file[self.index]
IndexError: list index out of range
有人能看看我下面的代码,帮我找出为什么它会给我这个吗
class Parser:
def __init__(self, filename):
self.asm_file = [line for line in open(filename)]
self.index = 0
def hasMoreCommands(self):
return self.index < len(self.asm_file)
def advance(self):
self.index += 1
if self.index == len(self.asm_file):
return
self.command = self.asm_file[self.index]
self.command = self.removeCommentsAndSpaces(self.command)
if not self.command:
self.advance()
您试图在脚本末尾访问一行,然后再访问存在的行。因此,尝试在函数末尾移动索引增量
def advance(self):
if self.index == len(self.asm_file):
return
self.command = self.asm_file[self.index]
self.command = self.removeCommentsAndSpaces(self.command)
self.index += 1
if not self.command:
self.advance()
为什么不重新使用代码呢?第二种方式:
def advance(self):
self.index += 1
if not self.hasMoreCommands():
return
self.command = self.asm_file[self.index]
self.command = self.removeCommentsAndSpaces(self.command)
if not self.command:
self.advance()
当您在递增之后和访问列表之前检查索引时,人们会认为您做得很好。然而,这里可能存在的问题是,在增加索引值之前,您已经达到了列表的长度。因此,增加后的索引比列表长度大一倍
您可以通过在访问列表之前打印出索引来轻松检查这一点。要走安全路线,只需更改支票即可:
if self.index >= len(self.asm_file):
return
事实上,您的问题发生在最后一段的第10行,即:
parser = Parser(sys.argv[1])
parser.advance()
如果只前进一次,则文件很可能为空,即列表的长度为零。因此,当您前进一次时,您的索引为
1
,它不等于长度(0
),但仍然超出列表访问的范围。是否有可能index
超过asm\U文件的长度而不完全匹配?如果是这样的话,您将看到您正在得到的错误。尝试将如果self.index==len(self.asm\u文件)
更改为如果self.index>=len(self.asm\u文件)
self.index += 1
if self.index == len(self.asm_file):
return
self.command = self.asm_file[self.index]
if self.index >= len(self.asm_file):
return
parser = Parser(sys.argv[1])
parser.advance()