2015-01-15 168 views
1

这里是我的测试脚本:访问全局函数的变量在局部函数

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!这与我以前关于本地/全局功能的所有信念相反!你知道得越多,你知道的就越不了解Python。

问题(S):

  • 为什么我能看到一个而不是其他?

  • 我想预先将global添加到我想重新分配的这些变量中吗?

+0

也许这可能会有所帮助:http://stackoverflow.com/a/21978980/748858 – mgilson

+0

啊哈,确实有用。谢谢。我原以为我不得不在功能之外使用'global',但是我可以在内部使用它。 – tenwest

+0

等待...也许这是我想的。不需要在功能的外部**定义'global'?我得到一个'NameError:全局名'x'未定义'。在函数之外调用它'global'并且使其工作。 – tenwest

回答

1

最好的解决方案是升级到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() 

像往常一样,“有计算机科学没问题,不能用额外的间接水平来解决”。通过使n成为一个列表(并且始终使用和分配n[0]),您在某种意义上正确地介绍了救命“额外间接级别”。

+0

不幸的是我受限于python2 ...这是一个非常有趣的解决方法,我现在可能会使用它,因为我不认为我们想要将有问题的变量声明为'global'。 – tenwest

+0

@tenwest,是的,只要有可能就应该避免使用'global'! –

0

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

例如:

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

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

main() 

现在同时显示nz当我的addone()函数内。这是因为我不再试图重新分配n,这对我来说是有意义的,以便保护全局变量免受操纵,如果碰巧在本地函数中使用了类似的名称。