“ UnboundLocalError:分配前已引用局部变量'x'”但这是全局变量

时间:2019-02-05 00:45:30

标签: python variables global local discord.py

我正在用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,该机器人完全没有启动。我该怎么办?

1 个答案:

答案 0 :(得分:1)

根据official docs

  

这是因为当您对范围中的变量进行赋值时,   该变量成为该范围的局部变量,并以相似的方式阴影   外部作用域中的命名变量。

简短版本:

您需要在函数范围之外声明全局变量,例如

#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();)。如果希望在同一行上放置多个语句,可以使用分号 分隔语句。