为什么这会导致出界错误?

时间:2017-12-17 20:39:50

标签: python list loops

所以我现在正在开展一个项目并不断收到此错误,但我不知道问题所在。

第92行,在比赛中     playerOne.append(桩[0]) IndexError:列表索引超出范围

我不明白是什么导致它超出范围。这是我的代码。我用于startHand和桩的所有列表都已在上面定义。

def play(startHand, pile):
playerOne = []
playerTwo = []

for i in range(0, 5):
    playerOne.append(startHand[i])
    i += 1

for i in range(5, 10):
    playerTwo.append(startHand[i])
    i += 1

initPoints = pile[0]

del pile[0]

if median(playerOne) == 9:
    scoreOne = initPoints
else:
    scoreOne = initPoints + median(playerOne)

if median(playerTwo) == 9:
    scoreTwo = initPoints
else:
    scoreTwo = initPoints + median(playerTwo)

playerOne.remove(median(playerOne))
playerTwo.remove(median(playerTwo))

playerOne.append(pile[0])
playerTwo.append(pile[1])

del pile[0]
del pile[0]

while scoreOne or scoreTwo < 99 or len(pile) > 0:
    if median(playerOne) == 9:
        scoreOne = scoreOne
    else:
        scoreOne = scoreOne + median(playerOne)

    if median(playerTwo) == 9:
        scoreTwo = scoreTwo
    else:
        scoreTwo = scoreTwo + median(playerTwo)

    playerOne.remove(median(playerOne))
    playerTwo.remove(median(playerTwo))

    playerOne.append(pile[0])
    playerTwo.append(pile[1])

    del pile[0]
    del pile[0]

如果有人可以解释导致错误的原因,我将非常感激。提前谢谢。

2 个答案:

答案 0 :(得分:1)

while scoreOne or scoreTwo < 99 or len(pile) > 0:

该行是错误的,错误的,错误的:

  • scoreOne or scoreTwo < 99实际上与(scoreOne) or (scoreTwo < 99)类似,因此只要scoreOne不为零,就会执行while语句(即使pile为空)
  • 即使有了修复,您仍然会使用or语句,这意味着pile 只要分数<&lt; 1&gt; 就可以为空99。

你想要的是

while scoreOne < 99 and scoreTwo < 99 and len(pile)>0:

或以更加pythonic的方式(测试空列表可以通过仅测试列表本身来检查此列表的“真实性”):

while scoreOne < 99 and scoreTwo < 99 and pile:
只要两个分数都低于99而且pile中有某些内容,就会让你的程序保持循环

答案 1 :(得分:1)

  

IndexError:列表索引超出范围

这意味着您正在访问它所拥有的元素之外的列表(f.e.)。检查列表内容并确保它不是无。