【问题标题】:Why is this causing an out of bounds error?为什么这会导致越界错误?
【发布时间】:2017-12-17 20:39:50
【问题描述】:

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

第 92 行,正在播放中 playerOne.append(堆[0]) IndexError: 列表索引超出范围

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

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]

如果有人能解释导致错误的原因,我将不胜感激。提前致谢。

【问题讨论】:

  • TL;DR 但pile 为空。
  • pile 必须为空,如果这是导致它的行。您无法获取空列表的第 0 个元素。
  • while len(pile) > 0 不会阻止运行吗?
  • scoreOne or scoreTwo &lt; 99 or len(pile) &gt; 0: 这是一个 OR 条件,而不是 AND...顺便说一句,这是错误的,因为您并没有真正将两个分数都与 99 进行比较...
  • 你想要while scoreOne &lt; 99 and scoreTwo &lt; 99 and pile:

标签: python list loops


【解决方案1】:

IndexError: 列表索引超出范围

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

【讨论】:

    【解决方案2】:
    while scoreOne or scoreTwo < 99 or len(pile) > 0:
    

    那一行错了,错了,错了:

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

    你想要的是

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

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

    while scoreOne < 99 and scoreTwo < 99 and pile:
    

    只要两个分数都低于 99 并且pile 中包含某些内容,让您的程序保持循环

    【讨论】:

    • 谢谢你这样做了,所以这可能是一个愚蠢的问题,但为什么堆:事情有效?
    • 它是“列表非空”的简写。
    • @Dylan docs.python.org/2.4/lib/truth.html - 有几件事评估为False
    猜你喜欢
    • 2013-06-06
    • 2020-07-26
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多