Python 为什么discord.py不识别“外部”变量;关于“u message()”;?

Python 为什么discord.py不识别“外部”变量;关于“u message()”;?,python,discord,undefined,discord.py,Python,Discord,Undefined,Discord.py,我的discord.py脚本给了我一个意外错误。它基本上将我在_message()上定义的async def之外的所有变量标记为“”,但在该字段下使用的变量都标记为“未定义” 那么,您也可以通过在message()上的下定义它们来轻松修复它。我试过了。 但是,问题是:每次发送消息时,变量都会被设置回您定义的值,即使您添加了变量,比如一行代码说,如果出现这种情况,请将其更改为另一个值。(例如prefix,正如您在下面的代码中所看到的,我想使用一个名为“changeprefix”的命令来更改bot的

我的discord.py脚本给了我一个意外错误。它基本上将我在_message()上定义的
async def之外的所有变量标记为“
”,但在该字段下使用的变量都标记为“未定义”

那么,您也可以通过在message()上的
下定义它们来轻松修复它。我试过了。
但是,问题是:每次发送消息时,变量都会被设置回您定义的值,即使您添加了变量,比如一行代码说,如果出现这种情况,请将其更改为另一个值。(例如prefix,正如您在下面的代码中所看到的,我想使用一个名为“changeprefix”的命令来更改bot的前缀,它可以工作,但是当另一条消息用该前缀发送时,它不会识别它;因为在开始时定义变量的行再次运行,并且它都被重置

除了在消息()上删除
并使用
discord.ext.commands
或其他什么方法之外,还有其他方法吗?我更熟悉
on-message()
系统,而且如果切换到它,我会更改整个脚本

import discord

client = discord.Client()
token= "some nice token"
#defining here results in "UnboundLocalError: local variable 'prefix' referenced before assignment", in the first line using the variable defined here

@client.event

async def on_message(message):
     #defining here results variables being refreshed each time a message is sent

我相信您正在寻找的是
global
,下面是一个关于如何使用它的简单示例

something=1
@客户端事件
异步def on_消息(消息):
全球某物
某物=某物+1
在第一次迭代时打印(某物)#2
#在on_消息之外
打印(某物)#2它是一样的
如果要将其与前缀一起使用,请将其设置为dict,并将
guild.id
作为键,值为前缀

顺便说一句,使用命令将更容易做到这一点

注意:如果重新启动bot,您将丢失此信息

如果我正确理解了您的问题,您需要一个变量,该变量将在每次调用命令时更改其值,您可以使用全局变量(我不推荐)或bot变量。还可以使用
commands.bot
,这样您就可以使用命令系统

bot=commands.bot(命令前缀='。)
#使用全局变量
my_var='我的价值'
@bot.command()
异步def foo(ctx,arg):
全局my_var
my_var=arg
等待ctx.send(f“将`my_var`值更改为`arg`”)
#使用bot变量
bot.my_var='my value'
@bot.command()
异步def foo(ctx,arg):
bot.my_var=arg
等待ctx.send(f“将`bot.my_var`值更改为`arg`”)

我不希望变量像在on_消息中一样不断更新。我想,你所展示的是,在函数内部定义它,同时使它成为全局变量,这样即使你在函数外部提到它,它也会被算作一个变量。你是对的。我在几个月后随机发现了这个问题,并重新阅读了你的答案。我,当时“应该全局”关键字用于在任何声明都是本地的地方定义全局变量。但据我所知,它用于引用已创建的全局变量。我的想法已经不那么合乎逻辑,而您可以在类似的地方之外创建全局变量。对于bot命令部分,我没有当我第一次找到你的答案时,我甚至没有看到它。很抱歉误导你。我希望变量不要像在on_消息中那样不断更新。我想,你展示的是,在函数内部定义它,同时使它成为全局变量,这样即使你在外部提到它,它也会被算作一个变量。你是对的。我发现了这个问题几个月后,我再次阅读了你的答案。我当时以为这是为了在任何声明都是局部的地方定义全局变量。但据我所知,这是为了引用一个已经创建的全局变量。我的想法已经不那么合乎逻辑了,而你已经可以在som之外创建全局变量了ewhere是这样的。很抱歉误导您。那么,您建议如何防止您在最后指出的情况?我认为每次运行代码时重新初始化所有内容的任何脚本都会发生这种情况。也许我可以使用另一个文件存储当前设备的信息,并使用一个数据库/服务器存储多个设备的信息。