nonlocal在Python 3.x中做什么?


关闭调试问题,OP需要非局部的,并没有意识到它,请使用Is it possible To modify variable in python that Is outer, but not global, scope?代替。

虽然Python 2在2020年1月1日正式不支持,但如果出于某种原因,您被迫维护Python 2。并且需要与nonlocal等价的,请参见Python 2.x中的nonlocal关键字。


当前回答

使用“非局部”内部函数(即嵌套内部函数)可以获得外部父函数的特定变量的读和写权限。而nonlocal只能在内部函数中使用 例如:

a = 10
def Outer(msg):
    a = 20
    b = 30
    def Inner():
        c = 50
        d = 60
        print("MU LCL =",locals())
        nonlocal a
        a = 100
        ans = a+c
        print("Hello from Inner",ans)       
        print("value of a Inner : ",a)
    Inner()
    print("value of a Outer : ",a)

res = Outer("Hello World")
print(res)
print("value of a Global : ",a)

其他回答

它取源代码中“最接近”的引用点。 这被称为“词法范围”,是>40年来的标准。

Python的类成员实际上在一个名为__dict__的字典中,并且永远不会通过词法作用域到达。

如果你不指定nonlocal,而是指定x = 7,它将创建一个新的局部变量"x"。 如果你指定了nonlocal,它会找到“最接近”的“x”并赋值给它。 如果你指定了nonlocal并且没有“x”,它会给你一个错误消息。

关键字global对我来说总是很奇怪,因为它会很高兴地忽略所有其他的“x”,除了最外面的那个。

简而言之,它允许您在外部(但非全局)作用域中为变量赋值。参阅PEP 3104了解所有血腥的细节。

文件如下:

非局部语句导致所列出的标识符被引用 先前在最近的封闭范围内绑定的变量除外 全局变量。

例如,inner()中的非局部变量foo可以访问middle()中的非局部变量foo = 10,但不能访问outer()中的非局部变量foo = 5或outer()外的全局变量foo = 0,如下所示:

foo = 0 # <- ✖
def outer():
    foo = 5 # <- ✖
    def middle():
        foo = 10 # <- 〇
        def inner():
            nonlocal foo # Here
            foo += 1
            print(foo) # 11
        inner()
    middle()
outer()

使用“非局部”内部函数(即嵌套内部函数)可以获得外部父函数的特定变量的读和写权限。而nonlocal只能在内部函数中使用 例如:

a = 10
def Outer(msg):
    a = 20
    b = 30
    def Inner():
        c = 50
        d = 60
        print("MU LCL =",locals())
        nonlocal a
        a = 100
        ans = a+c
        print("Hello from Inner",ans)       
        print("value of a Inner : ",a)
    Inner()
    print("value of a Outer : ",a)

res = Outer("Hello World")
print(res)
print("value of a Global : ",a)
a = 0    #1. global variable with respect to every function in program

def f():
    a = 0          #2. nonlocal with respect to function g
    def g():
        nonlocal a
        a=a+1
        print("The value of 'a' using nonlocal is ", a)
    def h():
        global a               #3. using global variable
        a=a+5
        print("The value of a using global is ", a)
    def i():
        a = 0              #4. variable separated from all others
        print("The value of 'a' inside a function is ", a)

    g()
    h()
    i()
print("The value of 'a' global before any function", a)
f()
print("The value of 'a' global after using function f ", a)