不明白为什么循环不会停止

时间:2016-03-20 00:45:43

标签: python loops while-loop

我在Python中使用while循环来执行操作。但是,当我期望它(团队变空)时,循环不会结束。这是代码:

while teams:
    if scores[0]<scores[1]:
        losers.append(teams[0])
        teams.remove(teams[0])
        teams.remove(teams[0])
        scores.remove(scores[0])
        scores.remove(scores[0])
    if scores[0]>scores[1]:
        losers.append(teams[1])
        teams.remove(teams[0])
        teams.remove(teams[0])
        scores.remove(scores[0])
        scores.remove(scores[0])
return losers

在测试代码时,我输入了print语句,发现失败者数组有预期的结果,但是在我期望它停止后循环继续,当我已经删除分数[0]时检查分数[0]循环的最后一次迭代。为什么我的循环没有结束?

3 个答案:

答案 0 :(得分:0)

仔细检查循环的条件。如果条件永远不等于false,则循环将变为无限。

请参阅http://www.tutorialspoint.com/python/python_while_loop.htm的“无限循环”部分。

答案 1 :(得分:0)

如果循环没有结束是因为teams永远不会变空。你的假设&#34;当[...] teams变空时,循环不会结束&#34;是不正确的,可能误导了你试图解决问题。

答案 2 :(得分:0)

修复方法是将第二个if语句更改为elif

while teams:
    if scores[0]<scores[1]:
        losers.append(teams[0])
        teams.remove(teams[0])
        teams.remove(teams[0])
        scores.remove(scores[0])
        scores.remove(scores[0])
    elif scores[0]>scores[1]:
        losers.append(teams[1])
        teams.remove(teams[0])
        teams.remove(teams[0])
        scores.remove(scores[0])
        scores.remove(scores[0])
return losers

问题是当teamsscores列表到达最后一对,并且第一个if语句中的条件是True时,最后一对是删除,两个列表都变空。

然后评估第二个if条件,但scores列表现在为空(由前面的if匹配提供),因此会引发IndexError。< / p>

将其更改为elif意味着只有在第一个条件为False时才会评估第二个条件。现在,循环每次迭代只处理一对团队/分数,空team的测试将成功。

你可以使while循环更清晰:

while teams:
    if scores[0] < scores[1]:
        losers.append(teams[0])
    elif scores[0] > scores[1]:
        losers.append(teams[1])
    else:
        # this should never happen
        print('Error: drawn match detected!')
        losers.append(None)    # or simply ignore if that makes sense

    teams[:] = teams[2:]    # remove the first 2 items
    scores[:] = scores[2:]