为什么当我输入10时才会出现“列表索引超出范围”错误?

时间:2019-09-24 11:22:41

标签: python

我知道我的索引在这种情况下不能大于8,因此输入10(因此xInput等于9)会导致列表索引超出范围。但是任何大于10的数字似乎都可以正常工作。

我尝试了

while xInput < 0 or xInput >= 9 or 'o' == board[xInput] or 'x' == board[xInput]:

,它确实可以正常工作。但是我似乎无法理解为什么这种方法行之有效,而我的另一种却不行。

这是我的原始代码

board = [1, 2, 3, 4, 5, 6, 7, 8, 9]
xInput = 90
oInput = 90
while xInput < 0 or xInput > 9 or 'o' == board[xInput] or 'x'==board[xInput]:
        xInput = int(input("x: ")) - 1
board[xInput] = 'x'

3 个答案:

答案 0 :(得分:0)

对于任何大于9的xInput,您都会陷入while循环中,因为xInput > 9是循环中的条件之一。

触发IndexError的代码行:

board[xInput] = 'x'

永远不会到达

答案 1 :(得分:0)

您正在使用or条条件进行评估。

当任何一个条件为真时,其余条件完全不评估。

example: A or B or C, where A/B/C could be some expression.

The boolean value of this depends on whether any of A/B/C is true. 

如果需要更严格地控​​制,可以尝试使用andxor条件

答案 2 :(得分:0)

输入10(因此{'Circle': 0.3705589911482963, 'Polygon': 0.34775978284076003, 'Square': 0.5312055617001106, 'Star': 0.19850208121615415, 'Trapezoid': 1.5383163853653423} )引发异常的原因是,您的 nom_1 target id 0 Circle 0 28152 1 Circle 1 9168 2 Polygon 0 24741 3 Polygon 1 11402 4 Square 0 32787 5 Square 1 16810 6 Star 0 31645 7 Star 1 14259 8 Trapezoid 0 71833 9 Trapezoid 1 29348 10 Triangle 0 19078 11 Triangle 1 10777 nom_1_dat = train.groupby(["nom_1","target"]).count()[["id"]].reset_index() print(nom_1_dat) nom_1_dict = {} i_list = [] for i,element in enumerate(nom_1_dat["nom_1"]): i_list.append(i) for i,element in enumerate(nom_1_dat["nom_1"]): if (i+1) < max(i_list): nom_1_dict[element] = (nom_1_dat["id"][i+1])/(nom_1_dat["id"][i]) print(nom_1_dict) 列表只有9个长度。在您的xInput = 9循环中,如果{{1 }},因为您将其设置为仅在board小于 9时循环。

因此,如果while为9,则它会尝试计算不存在的xInput == 9,因为列表是从0开始而不是从1开始索引的。因此,

xInput

您首先提到的while循环是正确的,因为在那里,您有一个循环条件xInput而不是board[9],因此只有在board[0] == 1 board[1] == 2 ... board[8] == 9 board[9] == ??? 时它才会退出循环正确评估。