IndexError:列表索引超出范围

时间:2014-01-02 05:50:55

标签: python list indexing

这是我的部分“寻找Wumpus(WAMPA)”游戏的代码。如果我制作范围(0,20),它可以工作,但如果我这样做(1,21),那么仍然有20个洞穴,但没有“洞穴编号0”......这只是我的屁股...而且它告诉我列表索引超出范围...不确定为什么在我的范围内将所有内容移动一位数就会这样做,因为在其他地方没有直接引用该范围内的特定数字...所以删除0应该没有这不是一个问题,但是唉......它是......这里是错误来自的代码:

from random import choice

cave_numbers = range(1,21)
caves = []
for i in cave_numbers:
    caves.append([])

for i in cave_numbers:
    for j in range(3):
        passage_to = choice(cave_numbers)
        caves[i].append(passage_to)

以下是完整的代码,只是为了完成:

from random import choice

cave_numbers = range(1,21)
caves = []
for i in cave_numbers:
    caves.append([])

for i in cave_numbers:
    for j in range(3):
        passage_to = choice(cave_numbers)
        caves[i].append(passage_to)


wampa_location = choice(cave_numbers)
wampa_friend_location = choice(cave_numbers)
player_location = choice(cave_numbers)
while (player_location == wampa_location or player_location == wampa_friend_location):
    player_location = choice(cave_numbers)

print("Welcome to Hunt the Wampa!")
print("You can see", len(cave_numbers), "caves.")
print("To play, just type the number")
print("of the save you wish to enter next.")

player_location != wampa_location

while True:
    if player_location != wampa_location:
        print("You are in cave", player_location)
        print("From here, you can see caves:", caves[player_location])
        if(player_location == wampa_location -1 or player_location == wampa_location +1):
              print("I smell a Wampa!")
        if(player_location == wampa_friend_location -1 or player_location == wampa_friend_location +1):
        print("I smell a stinky Wampa!")
    print("Which cave next?")
    player_input = input(">")
    if(not player_input.isdigit() or
             int(player_input) not in caves[player_location]):
          print(player_input, "isn't a cave you can see from here!")
    else:
          player_location = int(player_input)
          if player_location == wampa_location:
              print("Aargh! You got eaten by a Wampa!")
          if player_location == wampa_friend_location:
              print("Aargh! You got eaten by the Wampa's friend!")

我很抱歉,如果缩进很糟糕,有些线条包裹起来我失去了我的位置...但我认为错误是在前11行中。

谢谢你们

5 个答案:

答案 0 :(得分:1)

你的缩进很好,但你需要把(0,20)因为实际发生的事情就是当你追加它时没有定义每个洞穴[int]去的东西,如果你要使用字典这会完全可能,但是你最终会遇到caves = [[]*20]所以当你说for i in cave_numbers它试图从1开始并转到20时,但是因为python是从零开始的,所以当你发出错误时会引发错误达到20,因为caves实际上从0开始并且变为19,这仍然是20个数据。

答案 1 :(得分:0)

for i in cave_numbers:
    for j in range(3):
        passage_to = choice(cave_numbers)
        caves[i].append(passage_to)

这将使每个数字在1..20的范围内并尝试将其用作长度为20的列表的索引,获得洞穴编号2,3,... 20.当它到达i = 20时,它发现列表中没有包含该索引的元素,并且死亡。

答案 2 :(得分:0)

将范围从(0,20)更改为(1,21)不会像您期望的那样更改结果列表的大小。长度保持在20。

但是,由于您使用范围列表中的作为索引,因此最终索引太高。没有洞穴[20]因为那需要一个包含21个元素的列表,而你的列表只有20个元素(在这两种情况下都是如此)。

答案 3 :(得分:0)

也许你想要这样的东西? (测试)

#!/usr/local/cpython-3.3/bin/python

from random import choice

cave_numbers = range(1,21)
caves = []
for i in cave_numbers:
    caves.append([])

for index, cave in enumerate(caves):
    for j in range(3):
        passage_to = choice(cave_numbers)
        cave.append(passage_to)

答案 4 :(得分:0)

让我尝试为您解决这个问题:

说明

首先让我们检查一下前几行:

cave_numbers = range(1,21)
caves = []
for i in cave_numbers:
    caves.append([])

如果我们跟踪“内存”,它将看起来像这样:

cave_numbers = iterator
list(cave_numbers) = [1,2,3,4,5,...,20]
caves = [[],[],[],[],[],....,[]]

给您带来麻烦的部分就在这里发生。如您所见,cave_numbers从1到20,并且caves数组中正好有20个空列表,但是python中的数组的索引为零。意味着数组中的第一个元素实际上位于零位置。这是一个简单的示例,说明这意味着什么以及程序中将发生什么:

my_indices = [1,2,3,4,5]
my_list = [1,2,3,4,5]
print(f'{my_list[0]}')  # print out '1'
for i in my_indices:
  print(f'{my_list[i]}')  # print out '234' ... and then a index out of exception happens

发生索引超出范围异常是因为您将5用作绑定设置为[0,4]的数组的索引。

以下代码片段实际上产生了这个确切的问题:

for i in cave_numbers:
    for j in range(3):
        passage_to = choice(cave_numbers)
        caves[i].append(passage_to)  # here i will be substituted for '1' to 20'

访问caves[20]时会引发异常,因为此数组的边界实际上是[0, 19]

如何解决?

最简单的方法是始终将范围从零开始到N。在大多数情况下,零索引是编程的常态,您应该习惯于零索引。当需要任何包含索引的用户交互时,只需添加“ 1”,如下所示:

print(f'You are in cave {player_location + 1}')

本质上,用户并不关心如何在代码中为数组建立索引,但是您不应该向用户显示索引为零的状态是正确的(因为这可能会造成混淆)。

提示:

print('some text', variable)确实是老派-尝试在Python 3中使用f-strings(例如:print(f'some text {variable}')