我正在构建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
这可能是一个非常简单的错误,如果可以的话,我对此表示歉意,但是我已经为此挠了很久,似乎无法理解为什么...
谢谢。
答案 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