Python创建局部变量而不是使用全局变量

时间:2020-07-12 15:32:46

标签: python variables discord.py

我正在构建Discord机器人,但我认为这与Python的关系要大于与discord.py的关系

我具有此功能,用于识别服务器成员:

async def targetIdentificator(ctx):
    targetArgument = ctx.message.content.lower().replace(">target", "")

    for member in ctx.message.guild.members:
        if targetArgument.lower() in member.name.lower():
            targetID = member.id
            targetName =  targetArgument
            print("targetID")
    if targetID != "":
        return targetID
    else:
        return None

在代码中大约200行以上,我这样定义了两个变量:

targetName = ""
targetID = ""

在整个代码中,我在许多其他函数中多次使用了这些变量。在此函数中,发生的事情是,当我提到targetID时,它引用了一个新的局部变量,而不是引用了全局变量。因此,如果if周期内的for语句从未执行过,则会出现此错误:

UnboundLocalError: local variable 'targetID' referenced before assignment

这可能是一个非常简单的错误,如果可以的话,我对此表示歉意,但是我已经为此挠了很久,似乎无法理解为什么...

谢谢。

2 个答案:

答案 0 :(得分:1)

要在局部函数中更改全局变量,您需要使用global语句告诉python变量是全局变量

在这种情况下,它应该类似于:

async def targetIdentificator(ctx):
    global targetID
    global targetName
    ....

答案 1 :(得分:1)

使用global keyword明确告诉Python,您正在引用函数内部的全局变量,如下所示:

async def targetIdentificator(ctx):
    global targetID
    global targetName

    targetArgument = ctx.message.content.lower().replace(">target", "")

    for member in ctx.message.guild.members:
        if targetArgument.lower() in member.name.lower():
            targetID = member.id
            targetName =  targetArgument
            print("targetID")
    if targetID != "":
        return targetID
    else:
        return None