问题描述
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 x
的 def 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
。