在局部函数中访问全局函数的变量

Accessing global function's variables in a local function

这是我的测试脚本:

def main(): #global
    n = 1
    z = None

    def addone():  #local
        if not z:
            n = n+1
    addone()
    print n

main()

我在 addone() 函数到达调用行后进入该函数。 此时只能看到变量z,看不到n.

现在,如果 n 在赋值前被引用, z 不应该也是吗?

同样,如果我把n=n+1改成z='hi',我就再也看不到z了! 这与我之前对 local/global 函数的所有信念背道而驰!知道的越多,知道的越多,不知道的Python.

问题:

好吧,经过一些测试,我意识到这一切都与变量的重新分配有关。

例如:

def main(): #global
    n = 1
    z = None

    def addone():  #local
        if not z:
            x = n+1
    addone()
    print n

main()

当我在 addone() 函数中时,现在显示 nz。这是因为我不再尝试重新分配 n,这对我来说很有意义,以便在局部函数中碰巧使用相似名称时保护全局变量免受操纵。

最好的解决方案是升级到Python 3 并在内部函数nonlocal n 中使用。第二好的,如果你绝对必须坚持 Python 2:

def main(): #global
    n = [1]
    z = None

    def addone():  #local
        if not z:
            n[0] += 1
    addone()
    print n[0]

main()

像往常一样,"there is no problem in computer science that cannot be solved with an extra level of indirection"。通过制作 n 列表(并始终使用和分配 n[0]),从某种意义上说,您正是在介绍救命稻草 "extra level of indirection".