You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord机器人开发报错:List within Dictionary - int object is not iterable及购买问题

解决Discord机器人中字典列表的"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:47:22