discord.py开发中如何调用外层函数内部定义的变量?
问题根因
- 作用域关键字使用错误:
你定义的cards是blackjack函数的外层局部变量,不属于全局变量,global关键字仅用于声明全局作用域的变量,不适用于当前场景。同时你代码中的globals存在拼写错误,正确的global关键字没有末尾的s。 - 事件注册逻辑错误:
在命令内部用@bot.event注册on_message会直接覆盖全局的事件监听器,每次调用blackjack都会替换全局事件规则,会导致其他命令失效、多用户同时调用时变量互相串扰,不建议使用这种嵌套注册事件的写法。
临时修复(仅解决变量报错问题)
将内层函数的globals cards替换为nonlocal cards即可,nonlocal是Python3专门用于声明访问外层函数局部变量的关键字:
@bot.command() async def blackjack(ctx): cards = "♣️3" @bot.event async def on_message(msg): nonlocal cards print(cards)
该方案仅适合单用户本地测试,不建议在正式环境使用。
推荐正确实现方案
discord.py官方提供了bot.wait_for方法用于在命令内等待用户输入,无需嵌套注册事件,天然可以访问外层函数的变量,且不会影响全局事件规则、支持多用户同时调用:
@bot.command() async def blackjack(ctx): cards = "♣️3" print(cards) # 等待当前触发命令的用户在同频道发送消息,超时时间可自定义 try: msg = await bot.wait_for( "message", timeout=30, check=lambda m: m.author == ctx.author and m.channel == ctx.channel ) # 可直接访问外层cards变量,无需额外声明 print(f"当前手牌:{cards},用户输入:{msg.content}") except TimeoutError: await ctx.send("游戏超时,请重新发起")
内容的提问来源于stack exchange,提问作者bob asdf
相关产品推荐
相关产品推荐

