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

discord.py开发中如何调用外层函数内部定义的变量?

问题根因

  1. 作用域关键字使用错误:
    你定义的cards是blackjack函数的外层局部变量,不属于全局变量,global关键字仅用于声明全局作用域的变量,不适用于当前场景。同时你代码中的globals存在拼写错误,正确的global关键字没有末尾的s。
  2. 事件注册逻辑错误:
    在命令内部用@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 23:36:04