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

2024-04-19 11:51:42 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是我的测试脚本:

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的不了解就越多。你知道吗

问题:

  • 为什么我能看到一个却看不到另一个?

  • 我想在global前面加上我想重新赋值的变量吗?


Tags: 函数脚本noneifmainlocaldefnot
2条回答

最好的解决方案是升级到python3并在内部函数nonlocal n中使用。如果您必须坚持使用Python2,那么最好的选择是:

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

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

main()

像往常一样,“在计算机科学中,没有任何问题不能用额外的间接手段来解决”。通过把n列成一个列表(并且总是使用和分配n[0]),你在某种意义上正是引入了拯救生命的“额外间接层次”。你知道吗

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

例如:

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

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

main()

现在,当我在addone()函数中时,同时显示nz。这是因为我不再试图重新分配n,这对我来说是有意义的,以便在局部函数中使用类似名称时保护全局变量不被操纵。你知道吗

相关问题 更多 >