即使使用全局python也未定义变量


巨蟒刚开始在discord.py中处理cog,所以我把代码复制到cog中,但有一件事以前有效,那就是在cog中不起作用,我不知道为什么。下面的代码示例。
sverify_index=0
sverify_msg_id=""
@commands.Cog.listener()
async def on_message(self, message):
if message.channel.id == 888529033405530183 and message.author.id != 887542628063780864:
global sverify_index, sverify_msg_id
sverify_index += 1
sverify_list = []
sverify_list.append(sverify_index)

目前我得到的错误是

line 19, in on_message
sverify_index += 1
NameError: name 'sverify_index' is not defined

请帮忙。

基于缩进和self的存在,我认为你有类似的东西

class Something...:
sverify_index=0
sverify_msg_id=""
@commands.Cog.listener()
async def on_message(self, message):
...

这将使sverify_indexsverify_msg_id成为类级变量(由Something...的所有实例共享),而不是全局变量。

如果你真的想让它们成为全局变量,你可以做

sverify_index = 0
sverify_msg_id = ""
class Something...:
@commands.Cog.listener()
async def on_message(self, message):
global sverify_index, sverify_msg_id

使它们成为真正的全局变量。

正如AKX所提到的,它们目前是定义的类级变量。为了将它们作为全局变量,可以将它们移出类。

另一种方法

由于问题不是让它们成为全局变量,而是为什么它们在移动到类时不可访问,因此另一种解决方案可以是将它们保留为类级变量,然后像self.sverify_indexself.sverify_msg_id一样访问它们。

因此,解决方案如下

class Something(commands.Cog):
...
sverify_index=0
sverify_msg_id=""

@commands.Cog.listener()
async def on_message(self, message):
if (message.channel.id == 888529033405530183 and 
message.author.id != 887542628063780864):

self.sverify_index += 1
self.sverify_list = []
self.sverify_list.append(self.sverify_index)

最新更新