在python中分配错误之前引用


76

在Python中,出现以下错误:

UnboundLocalError: local variable 'total' referenced before assignment

在文件的开头(在错误来自的函数之前),我使用global关键字声明“总计”。然后,在程序主体中,在调用使用“总计”的函数之前,将其分配为0。我尝试在各个位置(包括文件顶部,在声明之后)将其设置为0。 ),但我无法使其正常工作。有人看到我在做什么错吗?


4
您在函数中声明全局变量吗?
Nikhil Chelliah,2009年

Answers:


152

我认为您错误地使用了“全局”。请参阅Python参考。您应该声明不带全局变量的变量,然后在要访问全局变量的函数内部声明它global yourvar

#!/usr/bin/python

total

def checkTotal():
    global total
    total = 0

请参阅以下示例:

#!/usr/bin/env python

total = 0

def doA():
    # not accessing global total
    total = 10

def doB():
    global total
    total = total + 1

def checkTotal():
    # global total - not required as global is required
    # only for assignment - thanks for comment Greg
    print total

def main():
    doA()
    doB()
    checkTotal()

if __name__ == '__main__':
    main()

因为doA()不修改全局总数,所以输出为1而不是11。


28
如果在局部作用域内分配给全局变量,那么只需要“ global”关键字可能一文不值。因此,在您的示例中,在checkTotal()中不需要全局声明。
格雷格·休吉尔

1
全面的答案,并对问题背后的基本误解进行了充分的分析。
Jarret Hardie

3
我的意思当然值得一提!未经删除阅读,仍然无法编辑评论。:(
Greg Hewgill 09年

当声明一个全局变量时,我必须给glob_val=None它赋一个值(我做了,亲爱的,我不能在没有赋值的情况下声明它
两栖机器人,2016年

6

我的场景

def example():
    cl = [0, 1]
    def inner():
        #cl = [1, 2] # access this way will throw `reference before assignment`
        cl[0] = 1 
        cl[1] = 2   # these won't

    inner()

0
def inside():
   global var
   var = 'info'
inside()
print(var)

>>>'info'

问题结束


2
通过简单的解释或注释来解释代码的工作方式将很有帮助
Anurag AS

公认的答案似乎已经涵盖了的用法global
Calculuswhiz

-1

我发现这个帖子的原因是我自己在自己的代码中有这个错误,而且我知道距发布该声明已经有一段时间了,您已经针对这种情况获得了一些答案和已解决的问题,但只想解释一下我如何解决以防万一可以帮助别人!基本上我最初以为是像使用REPL一样使用REPL.it进行代码编辑,就像为朋友制作东西一样,并且知道她无论如何都不想像代码编辑器那样下载,关键是我认为它不能无法处理代码,因为那时的复杂度在139点甚至更高,但是后来我开始试验并意识到,在我的函数集内,在a_loop函数内真正循环之外,该字母要注册,需要定义它!所以基本上我不是 在这种情况下,请务必在代码中定义计数功能!我将在这里分享我的代码,但是它像打印语句中的代码一样个人化,而且它的长度为2349行,是的,无论如何希望如此会有所帮助!如果可以的话,还建议您使用我可能会用到的一些代码,如果可以的话,可以将其放入更多脚本中,以使其更容易使用!再次希望对您有所帮助,如果您有任何疑问,请随时提出,我将尽我所能回答!我希望这有帮助!!!如果可以的话,将其添加到更多脚本中来!再次希望对您有所帮助,如果您有任何疑问,请随时提出,我将尽我所能回答!我希望这有帮助!!!如果可以的话,将其添加到更多脚本中来!再次希望对您有所帮助,如果您有任何疑问,请随时提出,我将尽我所能回答!我希望这有帮助!!!

-山姆

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.