0

我有这段代码:

n = int (input ('Enter the Number of Players: '))
m = [[j] for j in range (0, n)]
all_names= []
i = 0
while n > 1:
    m[i] = input('Player {0}: '.format (i+1))
    all_names.extend ([m[i]])
    if m[i][0] != m[i-1][-1]:
        b= m.pop (i)
        n = n-1
    if all_names.count (m[i]) == 2:
        n = n-1
        b= m.pop (i)
    i = i+1

它说索引超出范围(第二个 if 子句)但我不明白,为什么?

4

2 回答 2

0

我讨厌不直接回答您的问题,但是您尝试做的事情似乎……确实令人困惑。Python 有一条规则,应该有一种非常清晰、干净的做事方式,所以如果一段代码看起来很时髦(尤其是对于这样一个简单的函数),它可能没有使用正确的方法。

如果您只想创建一个名称容器,有许多更简单的方法:

players=int(input("How many players?\n"))
player_names=set()
while len(player_names)<players:
  player_names.add(input("What is player {}'s name?\n".format(len(player_names)+1)))

... 将为您提供一组独特的玩家名称,尽管这不会是有序的。这可能很重要(您的实现保持顺序,所以可能是这样),在这种情况下,您仍然可以使用列表并添加一个小检查以确保您添加了一个新名称而不是重复添加名称:

players=int(input("How many players?\n"))
player_names=list()
while len(player_names)<players:
  playname=input("What is player {}'s name?\n".format(len(player_names)+1))
  if playname not in player_names:
    player_names.append(playname)

我对有人喋喋不休地回避这个问题持开放态度,特别是如果提问者采取的方法有目的/原因的话。

于 2013-08-18T20:26:22.053 回答
0

每次代码进入第一个 if 子句时,m 的长度都会减小。但是,您在每次迭代中增加 i 的值。因此,在 m 长度的中点(如果始终输入第一个子句)或稍晚一点,i 的值将大于 m 的值,您将获得超出范围的索引。

于 2013-08-18T20:30:02.803 回答