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

2024-09-26 22:44:13 发布

您现在位置:Python中文网/ 问答频道 /正文

Python 刚开始在discord.py中使用cogs,所以我将代码复制到cogs中,但有一件事以前是不在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

请帮忙


Tags: 代码pyid示例messageindexonmsg
2条回答

基于缩进和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)

相关问题 更多 >

    热门问题