我正在用discord.py制作一个Python Discord机器人。我对Python相对较新,但是在其他语言方面拥有大约八年的经验。我的问题是即使我将UnboundLocalError: local variable 'prefix' referenced before assignment
定义为全局变量,我也得到了prefix
。 (我正在使用Python 3.6.8)
我尝试在on_ready
函数外部定义变量,但得到的结果相同。
import discord;
client = discord.Client();
@client.event
async def on_ready():
print('Loading complete!')
...
global prefix
prefix = 'hello world'
@client.event
async def on_message(message):
if message.author == client.user:
return
messageContents = message.content.lower()
splitMessage = messageContents.split()
try:
splitMessage[0] = splitMessage[0].upper()lower()
except:
return
if splitMessage[0]==prefix:
...
(later in that if statement and a few nested ones)
prefix = newPref
client.run('token')
我希望输出的结果是它在if语句中运行代码,但是我收到错误UnboundLocalError: local variable 'prefix' referenced before assignment
并且没有代码运行。
我唯一想到的问题是prefix = newpref
。我尝试过:
global prefix
prefix = newpref
但是随后我得到了错误:SyntaxError: name 'prefix' is used prior to global declaration
,该机器人完全没有启动。我该怎么办?
答案 0 :(得分:1)
这是因为当您对范围中的变量进行赋值时, 该变量成为该范围的局部变量,并以相似的方式阴影 外部作用域中的命名变量。
简短版本:
您需要在函数范围之外声明全局变量,例如
#declaring the global variable
x = 10
def foobar():
#accessing the outer scope variable by declaring it global
global x
#modifying the global variable
x+=1
print(x)
#calling the function
foobar()
长版:
基本上,python中的所有内容都是一个对象,这些对象的集合称为namespaces。
每个模块都有自己的专用符号表,该表用作 全局符号表由模块中定义的所有功能组成。就这样 模块的作者可以在不使用模块的情况下使用全局变量 担心与用户的全局变量发生意外冲突。
因此,当您运行bot脚本时,python会将其视为作为具有主全局范围的主脚本运行的模块。
在全局范围内声明变量时,要在某些函数的局部范围内使用变量,您需要使用关键字global
来访问模块的全局范围。
此外,python不需要要求分号来终止语句(例如client = discord.Client();
)。如果希望在同一行上放置多个语句,可以使用分号 分隔语句。