Python嵌套循环触发IndexError: list index out of range求助
问题分析与修复
1. 索引越界的直接原因
你代码里的items列表是从初始inventory的键生成的,初始inventory只有['gold coin', 'rope']两个元素,所以items的长度是2。但外层循环的i是遍历addedItems的索引(长度为5),当i >= 2时,items[i]就会触发IndexError,因为items根本没有索引2、3、4的元素。
而且这段双重循环的逻辑完全错误:你本来是想对比addedItems[i]和inventory里的每个键,但写成了和items[i]对比,完全不符合需求。
2. 其他隐藏问题
inventory[items[j]] =+ 1是错误写法,=+是赋值正1,不是累加,正确的累加应该是+= 1addToInventory函数没有返回值,最后inv = addToInventory(...)会把inv变成None,导致后续displayInventory(inv)报错- 用双重循环遍历效率低,Python字典本身可以直接通过键判断存在性,不需要把键存到列表里再遍历
3. 修复后的代码
def displayInventory(inventory): print("Inventory: ") item_total = 0 for k, v in inventory.items(): item_total += v print(v, k) print("Total number of items: " + str(item_total)) def addToInventory(inventory, addedItems): for item in addedItems: # 存在则加1,不存在则设为1 inventory[item] = inventory.get(item, 0) + 1 # 返回修改后的inventory return inventory inv = {'gold coin': 42, 'rope': 1} dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby'] inv = addToInventory(inv, dragonLoot) displayInventory(inv)
4. 代码说明
- 直接遍历
addedItems里的每个物品,用inventory.get(item, 0)获取当前数量(不存在则返回0),再加1赋值回去,逻辑简洁高效 - 确保
addToInventory返回修改后的inventory,外部的inv变量才能拿到更新后的字典 - 去掉了多余的
items和amount列表,字典本身的键查找是O(1)效率,比遍历列表更快
内容的提问来源于stack exchange,提问作者ZhNgR
相关产品推荐
相关产品推荐

