Python非本地和全局如何协同工作?

时间:2018-10-03 10:50:50

标签: python closures

这是我的例子

x=0
def outer():
    x = 1
    def i1():
        nonlocal x
        x = 2
        print("inner1:", x)

    i1()
    print("outer:", x)

    def i2():
        nonlocal x
        x = 3
        print("inner2:", x)

    i2()
    print("outer:", x)

    def i3():
        global x
        print("inner3:", x)

    i3()
    print("outer:", x)

outer()
print("global:", x)

Jupyter中的输出

inner1: 2
outer: 2
inner2: 3
outer: 3
inner3: 0
outer: 3
global: 0

为什么外部的值是0?

2 个答案:

答案 0 :(得分:4)

angular.json中,当您声明i3()时,它的确使用了最外面的global x,但您没有更改其值。

在代码的这一部分:

x

i3() print("outer:", x) 命令不在print方法之外,因此正在使用全局i3()。将使用本地xx中的global命令意味着仅i3()中使用的x是全局的。在i3()之外,i3()的声明global范围将结束。

因此,x显示3,这是print("outer:", x)方法的局部变量值。最外面的outer()始终为0。

答案 1 :(得分:1)

我认为您的测试用例存在错误。如果我将i3更改为:

    def i3():
        global x
        x = "i3"
        print("inner3:", x)

然后我得到

global: i3
最后,正如我所期望的那样。