Python:列表索引超出范围。我不知道如何解决这个问题

时间:2015-11-19 23:41:37

标签: python list range

def RPS():
    userRPS = input("Rock, paper, or scissors? ")
    RPSlist = ["rock", "paper", "scissors"]
    computerRPS = RPSlist[randint(1,3)]
    print("\nI chose " + computerRPS + ", and you chose " + userRPS)
    elif userRPS == "scissors":
        if computerRPS == "rock":
            print("You lose.")
        elif computerRPS == "paper":
            print("You win.")
        elif computerRPS == "scissors":
            print("I chose scissors too. Go again.")
            RPS()
    else:
        print("?")
        RPS()

因此,如果我运行else语句,它会打印列表索引超出范围。如果用户和随机生成器选择相同的事情,也会发生同样的情况。我试图学习如何解决这个问题,但我真的不理解任何解释。

4 个答案:

答案 0 :(得分:1)

你应该做randint(0,2),因为RPSList是零索引的。这解决了超出范围的错误,但你也应该做“if ... else”而不是“elif ... else”。

答案 1 :(得分:1)

更好的方法就是使用random.choice

e.g。

import random

RPSlist = ["rock", "paper", "scissors"]
print(random.choice(RPSlist))

这样你就不必关心列表的长度。

这条线变为

computerRPS = random.choice(RPSlist)

如果没有前面的elif,您就不能拥有if。因此,您只需将elif更改为if

答案 2 :(得分:0)

一些变化:

elif userRPS == "scissors":

应该是

if userRPS == "scissors":

computerRPS = RPSlist[randint(1,3)]

应该是

computerRPS = RPSlist[randint(0,2)]

始终记住,列表索引从0计算,而不是从1计算。

答案 3 :(得分:0)

参考你问题的这一部分

我真的不理解任何解释。

在您编辑之前,您提出

的问题
computerRPS = RPSlist[randint(0,3)]

现在编辑后你的新命令是

computerRPS = RPSlist[randint(1,3)]

两者都会导致列表索引超出范围?

computerRPS = RPSlist[randint(1,3)]

为例

可以生成

RPSlist[1]
RPSlist[2]
RPSlist[3]

但您的RPSlist有三个从0开始的元素

RPSlist = ["rock", "paper", "scissors"]
             ^        ^         ^
             0        1         2

现在如果randint(1,3)给你一个随机数,例如 3 。你的变量将是

RPSlist[3]

但你是数组没有索引为3的任何变量。最大索引元素是2

因此您的索引超出范围错误