【问题标题】:Why does python show 'list index out of range' error?为什么 python 显示“列表索引超出范围”错误?
【发布时间】:2018-07-24 11:41:03
【问题描述】:

我对 python 很陌生,1 周前才开始学习。该程序运行良好,除非我在以 0 开头的guess1 变量中输入数字。

import random
import sys
def script():
    while True:
        number1 = random.randint(1000, 9999)
        number1 = int(number1)
        while True:
            print ("Enter Your Guess")
            guess1 = input()
            guess1 = int(guess1)
            while True:
                if guess1 != number1:
                    break
                elif guess1 == number1:
                    print ("Your Guess Was Right!")
                    print ("Do you want to play again? Type YES or NO")
                    ask = input()
                    ask = str(ask)
                    if ask == "YES" or ask == "yes":
                        script()
                    elif ask == "NO" or ask == "no":
                        sys.exit()
                    else:
                        print ("Invalid input, try again.")
                        continue
            number = list(str(number1))
            guess = list(str(guess1))
            if len(guess) > 4:
                print ("Please type a 4-digit number")
                continue
            bulls = 0
            wr = 0
            cows = 0
            a = 3
            while a >= 0:
                if number[a] == guess[a]:
                    number[a] = 'a'
                    guess[a] = 'b'
                    bulls += 1
                a -= 1
            b = 0
            c = 0
            while b < 4:
                c = 0
                while c < 4:
                    if number[b] == guess[c]:
                        number[b] = 'a'
                        guess[c] = 'b'
                        wr += 1
                    c += 1
                b += 1
            z = bulls + wr
            cows = 4 - z
            bulls = str(bulls)
            cows = str(cows)
            wr = str(wr)
            print ("Cows: "+cows)
            print ("Bulls: "+bulls)
            print ("Wrongly Placed: "+wr)
        break
script()

这是一个为游戏编写的程序,其中要猜一个 4 位数字。我们从一个随机数开始,我们以奶牛、公牛和错误放置的形式获得线索。奶牛表示数字错误,公牛表示数字正确,错误放置表示数字正确但放置错误。
整个事情正常,但是当我输入一个以 0 开头的数字时,它会显示如下内容:-

Traceback (most recent call last):
  File "GuessingGame.py", line 61, in <module>
    script()
  File "GuessingGame.py", line 36, in script
    if number[a] == guess[a]:
IndexError: list index out of range

请帮忙,谢谢!

更新:

感谢用户@blue_note 的回答,该程序现在可以运行了!这就是它的修改方式-

import random
import sys
def script():
    while True:
        number1 = random.randint(1000, 9999)
        number1 = int(number1)
        while True:
            print ("Enter Your Guess")
            guess1 = input()
            number = list(str(number1))
            guess = list(str(guess1))
            if guess[0] == 0:
                guess1 = str(guess1)
            else:
                guess1 = int(guess1)
            while True:
                if guess1 != number1:
                    break
                elif guess1 == number1:
                    print ("Your Guess Was Right!")
                    print ("Do you want to play again? Type YES or NO")
                    ask = input()
                    ask = str(ask)
                    if ask == "YES" or ask == "yes":
                        script()
                    elif ask == "NO" or ask == "no":
                        sys.exit()
                    else:
                        print ("Invalid input, try again.")
                        continue
            bulls = 0
            wr = 0
            cows = 0
            a = 3
            while a >= 0:
                if number[a] == guess[a]:
                    number[a] = 'a'
                    guess[a] = 'b'
                    bulls += 1
                a -= 1
            b = 0
            c = 0
            while b < 4:
                c = 0
                while c < 4:
                    if number[b] == guess[c]:
                        number[b] = 'a'
                        guess[c] = 'b'
                        wr += 1
                    c += 1
                b += 1
            z = bulls + wr
            cows = 4 - z
            bulls = str(bulls)
            cows = str(cows)
            wr = str(wr)
            print ("Cows: "+cows)
            print ("Bulls: "+bulls)
            print ("Wrongly Placed: "+wr)
        break
script()

因为如果第一个数字是0,我的猜测总是错误的,所以我不需要将它转换为int。

再次感谢大家的帮助!这是我在网站上的第一个问题。这真是一个很酷的网站。

【问题讨论】:

  • 在出现错误的第 36 行之前,执行 print(len(number))、print(len(guess)) 和 print(a)。您应该看到a 可能太大而无法索引两个列表之一(请注意,length-1 是可能的最大索引)
  • 当您包装为 int 时,您的前导零会丢失 - 因此,当您猜测 '0010' 时,将其包装为整数会将其转换为 10。
  • 例如,我猜是因为如果你使用一些以 0 开头的数字,但 list(str(num)) 的长度只有 3 或更少。后来你调用了 num[3],因此超出了索引。
  • 感谢大家的回答!这真的很有帮助。转换为 int 是错误的 - 所以只需删除该行就可以纠正错误吗?

标签: python error-handling runtime-error


【解决方案1】:

当你传递一个以 0 开头的整数,比如 0123,然后在下一行将它转换为 int,你会得到 123(3 位数字)。稍后,您执行number = list(str(number1)),因此您的number 为['1', '2', '3'](长度为3)。然后,您尝试使用a=3 获取number[a],这就是您得到错误的原因。

你可以做类似的事情

number = list(str(number1) if number1 > 999 else '0' + str(number1))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-10
    • 2021-05-12
    • 1970-01-01
    • 2016-01-06
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多