Python 变量明显为局部变量时的UnboundLocalError

Python 变量明显为局部变量时的UnboundLocalError,python,global,Python,Global,我有一个类似的程序: curpuz = 1 def puzzle(req,_): puzzledat = json.loads(open('puzzles.txt','r').read()) puzzleque = puzzledat[str(curpuz)]['q'] req.say('Current puzzle: ' + puzzleque + ' - !ans <answer>') def puzzlea(req,arg): puzzled

我有一个类似的程序:

curpuz = 1

def puzzle(req,_):
    puzzledat = json.loads(open('puzzles.txt','r').read())
    puzzleque = puzzledat[str(curpuz)]['q']
    req.say('Current puzzle: ' + puzzleque + ' - !ans <answer>')

def puzzlea(req,arg):
    puzzledat = json.loads(open('puzzles.txt','r').read())
    puzzleans = puzzledat[str(curpuz)]['a']
    if arg[0] == puzzleans:
        req.say('%tip ' + req.nick + ' 50 -- ' + req.nick + ' got the correct answer! Use !puzzle to get the next puzzle!')
        try:
            puzzledat = json.loads(open('puzzles.txt','r').read())
            curpuz += 1
            puzzleque = puzzledat[str(curpuz)]['q']
            puzzleans = puzzledat[str(curpuz)]['a']
        except:
            req.say("Uh oh no more puzzles :(")
            puzzleans = 'no more'
    else:
        req.reply('Incorrect')
curpuz=1
def拼图(要求):
puzzdat=json.load(打开('puzzles.txt','r').read())
puzzle=puzzdat[str(curpuz)]['q']
请求语句('当前拼图:'+puzzleque+'-!ans')
def A(请求,参数):
puzzdat=json.load(打开('puzzles.txt','r').read())
puzztans=puzzdat[str(curpuz)]['a']
如果arg[0]==谜题:
请求说('%tip'+req.nick+'50--'+req.nick+'得到了正确的答案!使用!拼图获得下一个拼图!')
尝试:
puzzdat=json.load(打开('puzzles.txt','r').read())
curpuz+=1
puzzle=puzzdat[str(curpuz)]['q']
puzztans=puzzdat[str(curpuz)]['a']
除:
要求说(“哦,没有更多的谜题:(”)
拼图游戏=‘不再’
其他:
请求回复(“不正确”)
但是我继续得到一个
未绑定的LocalError(“赋值前引用的局部变量'curpuz')
,即使该变量显然是局部变量。

试试这个

def puzzlea(req,arg):
    global curpuz

然而,它是局部的,只是没有绑定。如果它是全局的,你会得到一个
NameError
curpz
不是
puzza
的局部变量。你可以像在
puzzle()
中那样隐式引用一个模块范围变量,但要像在
puzza
中那样分配给它(
curpuz==1
),您需要在函数中本地绑定它,或者(正如您在这里可能希望的那样)在函数范围内显式地将其标记为全局。@SilasRay:它在
puzza
中是局部的,因为它被赋值给了。@MartijnPieters足够正确。我应该说,他要引用的模块级变量在函数中没有局部绑定,所以赋值是对具有相同名称的局部未绑定变量进行的@SilasRay:函数中的第二行尝试访问名称;这是
UnboundLocalName
异常的来源:
puzzans=puzzdat[str(curpuz)]['a']