Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
I';我在Python中得到一个索引错误,说它';它超出范围,但我';我不知道为什么_Python_Traceback - Fatal编程技术网

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()