首页 > 解决方案 > 特定功能的非本地绑定

问题描述

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) 的值?以及如何使用[2]def outer()的值指定?nonlocal xdef inner()

我需要的输出:

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

标签: pythonpython-nonlocal

解决方案


每当您指定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)。因此,如果您分配给xin vnat,它将有效地分配给outer's name x


推荐阅读