针对特定功能的非本地绑定

问题描述

x = 0
def outer():
    x = 1
    def inner():
        nonlocal x
        x = 2
        def vnat():
            nonlocal x
            x = 5
            print('vnat:',x)

        vnat()
            
        print('inner:',x)

    
    inner()
    print('outer:',x)


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

结果如下:

vnat: 5
inner: 5
outer: 5
global: 0

为什么 def outer()def vnat() (5) 的值?以及如何从 def outer() [2] 指定值为 nonlocal xdef inner()

我需要的输出

vnat: 5
inner: 5
outer: 2
global: 0

解决方法

每当您指定 nonlocal x 时,它将引用封闭范围的名称。因此,在您的示例中,您具有以下嵌套范围:

global --> outer --> inner --> vnat
  |         |          |        |
  v         v          v        v
 x=0       x=1  <--nl--x <--nl--x       "nl" stands for "nonlocal"

所以 vnat 指的是其封闭范围的 x(即 inner 的范围),而后者又指其封闭范围的 x(即outer)。 因此,如果您分配给 x 中的 vnat,它将有效地分配给 outer 的名称 x