Python全局变量在函数的第二范围级别内不可访问

时间:2012-07-12 18:54:59

标签: python-2.7 scoping

  

可能重复:
  Python variable assigned by an outside module is accessible for printing but not for assignment in the target module

一般考虑来自其他语言的范围规则,我有点假设Python的范围规则对于全局变量是相似的,直到我在下面的代码中遇到变量 count 的问题:

count=1

def intPermute(fix,var):

    if len(var) ==2:
        #import pdb
        #pdb.set_trace()
        print ("%d: %s%c%c" % (count, str(fix),var[0],var[1]))
        count+=1
        print ("%d: %s%c%c" % (count, str(fix),var[1],var[0]))
        count+=1

    else:
        for i in range(len(var)):
            intPermute(fix+var[i],var[:i]+var[i+1:])



def permuteStr(string):
    # permute a string for nPn combinations basically n!
    if string =="" or len(string) <=0:
        return;
    if len(string) <2:
        print "%d: %s" % (count, str(string))

    intPermute("",string)

我收到以下错误:   在intPermute中输入文件“/Users/ns/permute2.py”,第9行     print(“%d:%s%c%c”%(count,str(fix),var [0],var [1])) UnboundLocalError:赋值前引用的局部变量'count'

为什么定义python范围规则使得我无法访问函数intPermute的内部范围(if语句)中的全局变量计数?可以在函数的第一个语句范围级别访问相同的变量吗?这是为什么? 我知道可以通过在函数中定义同名的局部变量来“覆盖”全局范围变量,但这似乎不是这种情况。

我能够在intPermute函数的开头添加以下语句来解决这个问题: 全球统计

def intPermute(fix,var):

    global count
    if len(var) ==2:
        #import pdb
        #pdb.set_trace()
        print ("%d: %s%c%c" % (count, str(fix),var[0],var[1]))
        count+=1
        print ("%d: %s%c%c" % (count, str(fix),var[1],var[0]))
        count+=1

    else:
        for i in range(len(var)):
            intPermute(fix+var[i],var[:i]+var[i+1:])

现在,全局的这个含义对我来说并不明显,我认为全局关键词是在全球范围内“导出”一个局部变量。

所以2个问题: 1)为什么Python不允许在函数intPermute的二级范围内查看全局变量计数?虽然它可以在函数的第一级范围内访问? 2)为什么global关键字可以解决这个问题?它是否总能解决1级升级的全局变量?

感谢。

1 个答案:

答案 0 :(得分:1)

这是“按设计”,请参阅:http://bugs.python.org/issue9049