Discord机器人开发报错:List within Dictionary - int object is not iterable及购买问题
嘿,我来帮你搞定这个问题!这个报错的核心原因很明确:你在代码里不小心尝试去遍历一个整数(int类型),而整数并不是可迭代对象(没法用for循环之类的操作去遍历它)。咱们结合你的场景一步步拆解解决:
先明确你的字典结构问题
你的示例字典是{'DiscordName#0000': [23, 'test item']},每个用户对应的value是一个长度为2的列表——第一个元素是价格(int),第二个是物品名(string)。但报错说明你在处理!buyitem命令时,要么是初始化这个列表的方式错了,要么是后续遍历/操作时误把列表里的价格当成了可迭代对象。
常见错误场景&修复方案
1. 初始化字典时结构错误
如果你的代码在用户第一次购买时,直接把价格存成了字典的value,而不是包裹成列表,就会触发这个错误:
# ❌ 错误写法:直接存了int类型的价格 userShop[discord_name] = cost # ✅ 正确写法:把价格和物品名包裹成列表存入 userShop[discord_name] = [cost, item_name]
错误写法会导致userShop[discord_name]直接是一个int,后续任何尝试遍历它的操作都会报错。
2. 误把列表中的价格当成可迭代对象遍历
比如你可能写了类似这样的代码:
# ❌ 错误:尝试遍历价格(int),这肯定会报错 for detail in userShop[discord_name][0]: ...
这里userShop[discord_name][0]是价格(int),没法遍历。如果是要处理单物品的信息,直接通过索引访问即可,不需要遍历;如果要支持用户购买多个物品,那你需要调整字典结构为列表的列表:
# 支持多物品的结构:每个用户对应一个包含多个[价格,物品名]列表的大列表 userShop = {'DiscordName#0000': [[23, 'test item'], [15, 'another item']]}
此时添加新物品的逻辑应该是:
if discord_name in userShop: userShop[discord_name].append([cost, item_name]) else: userShop[discord_name] = [[cost, item_name]]
这样遍历用户的所有物品时,for item in userShop[discord_name]就会遍历每个[价格,物品名]的小列表,不会再触发int迭代的错误。
完整的!buyitem命令示例代码
这里给你一个能正常运行的单物品版本代码参考:
userShop = {} @bot.command() async def buyitem(ctx, cost: int, *, item_name: str): # 获取用户的完整Discord名称(比如"ocelot#1234") discord_name = str(ctx.author) # 存入[价格,物品名]结构的列表 userShop[discord_name] = [cost, item_name] await ctx.send(f"购买成功!物品:{item_name},价格:{cost}")
如果要支持多物品,把注释里的多物品逻辑替换进去就行。
最后总结
排查一下你的代码,找到哪里在处理userShop时把int类型的价格当成了可迭代对象——要么是初始化时没包裹成列表,要么是遍历/操作时访问了错误的元素。调整结构或者修正操作逻辑,这个报错就能解决啦!
内容的提问来源于stack exchange,提问作者ocelot

