1

可能重复:
由外部模块分配的 Python 变量可用于打印,但不能用于在目标模块中分配

通常考虑其他语言的作用域规则,我有点假设 Python 的作用域规则与全局变量相似,直到我在下面的代码中遇到变量计数问题:

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)

我收到以下错误:文件“/Users/ns/permute2.py”,第 9 行, intPermute 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:])

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

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

谢谢。

4

1 回答 1

2

这是“设计使然”,参见:http ://bugs.python.org/issue9049

于 2012-10-13T03:00:39.923 回答