【问题标题】:Traceback (Most recent call last) error in pythonpython中的回溯(最近一次调用)错误
【发布时间】:2014-09-26 23:52:11
【问题描述】:
def adder(l1,l2,op):

    if(op == 0):

        carry = 0
        result = []
        l1.reverse()
        l2.reverse()

        for x in range(0, 4):

            sum = l1[x] + l2[x] + carry

            if(sum == 0):
                result[x] = 0
                carry = 0
            elif(sum == 1):
                result[x] = 1
                carry = 0
            elif(sum == 2):
                result[x] = 0
                carry = 1
            elif(sum == 3):
                result[x] = 1
                carry = 1

            if(x == 2):
                carry_in = carry
            if(x == 3):
                carry_out = carry

    result.reverse()

    overflow = carry_in ^ carry_out
    sign = result[3]
    zero = not(result[0] | result[1] | result[2] | result[3]) 
    sign_of_true_result = overflow ^ sign

    print result,carry,overflow,sign,zero,sign_of_true_result


number1 = []
number2 = []
print "Enter the bits of number 1 one by one: "

x = 0
while(x < 4):

    digit_1 = raw_input()

    if(digit_1 != '0' and digit_1 != '1'):
        print "Please enter either 0 or 1"
        continue
    else:
        x = x + 1
        number1.append(int(digit_1))

print "Enter the bits of number 2 one by one: "

y = 0       
while(y < 4):

    digit_2 = raw_input()

    if(digit_2 != '0' and digit_2 != '1'):
        print "Please enter either 0 or 1"
        continue
    else:
        y = y + 1
        number2.append(int(digit_2))

op = int(raw_input("Press 0 for addition or 1 for substraction (Op): "))

if __name__ == '__main__':
    adder(number1,number2,op)

我正在尝试实现 4 位二进制加法器。我收到以下错误。第 22 行有什么问题?我不明白为什么会出现超出范围的错误。

错误:

Traceback (most recent call last):
  File "ex9.py", line 85, in <module>
    adder(number1,number2,op)
  File "ex9.py", line 22, in adder
    result[x] = 0
IndexError: list assignment index out of range

【问题讨论】:

  • 要了解为什么这是一个错误,您必须知道x 中的内容以及result 中的内容。您可以使用调试器或交互式可视化工具找到它,或者只是在该行之前添加print(x, result),然后告诉我们您看到了什么。或者,更好的是,您可以将其简化为minimal, complete, verifiable example,以便某人可能一眼就能理解和调试,或者自己运行,以找到您的问题。 (这包括输入,而不仅仅是代码!或者,更好的是,将输入硬编码到您的示例中。)
  • 无论如何,我什至可以不读代码就大胆尝试一下:你已经实现了进位,你正在添加两个 4 位数字,你可能将结果存储在一个列表中4 位,如果您下溢或溢出,您最终会尝试将位设置为第五位,而该位不存在。
  • 我正在运行 for 循环 4 次以添加所有四个位。不是设置第五位的点。无论如何,这个错误并不重要,我可以通过调试来弄清楚。我对第 85 行发生的第一个错误更感兴趣。在问这个问题之前,我做了充分的研究。 :)

标签: python traceback


【解决方案1】:

你从这个开始:

result = []

所以result 没有值。

第一次循环时,x0,您尝试将result[0] 重新分配给01。但是没有没有result[0]。所以你会得到一个IndexError

你可以在一个更简单的例子中看到同样的事情:

>>> result = []
>>> result[0] = 0
IndexError: list assignment index out of range

您要么需要重新组织代码,以便在获取位时附加或预先添加位,要么需要预先填写 result,例如 [None, None, None, None][0, 0, 0, 0] 或其他内容,以便 @ 987654334@ 有道理。


我对第 85 行出现的第一个错误更感兴趣。

第 85 行并没有真正的错误。请注意,回溯显示“最近一次调用最后一次”:

Traceback (most recent call last):
  File "ex9.py", line 85, in <module>
    adder(number1,number2,op)
  File "ex9.py", line 22, in adder
    result[x] = 0
IndexError: list assignment index out of range

第 22 行的 adder 中的 result[x] = 0 引发了 IndexError,因为 x0 并且 result 是空的。

模块顶层第 85 行的 adder(number1,number2,op) 引发了 IndexError,因为它调用了引发 IndexError 并且没有 try:/except IndexError: 的函数(或IndexError) 的一些超类。

而且,因为那是在顶层,所以在你的代码中没有更高的地方可以处理它,所以解释器通过打印出回溯并退出来处理它。

【讨论】:

  • 那是彻底而完整的解释。所以我很菜鸟。奇怪的是,当我纠正这个错误时,另一个错误消失了。有什么解释吗?
  • @Aashil:不知道另一个错误是什么,或者你用什么解决方案来纠正这个错误,我想我无法解释......
  • @Aashil:实际上,我想我可能已经明白你的意思了。查看我的编辑。
  • 现在解释更完整了。谢谢 :) 无论如何,我没有直接将 0 或 1 分配给“结果”,而是将它们附加到“结果”中,例如:result.append(0) 或 result.append(1)
  • 我习惯用java。 Python对我来说有点新。很抱歉问了一个幼稚的问题,感谢您更耐心地回答
猜你喜欢
  • 2022-01-10
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多