特定功能的非本地绑定
Posted
技术标签:
【中文标题】特定功能的非本地绑定【英文标题】:binding of nonlocal for specific function 【发布时间】:2021-05-08 15:44:51 【问题描述】: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 inner()
[2] 中指定def outer()
值为nonlocal x
?
我需要的输出:
vnat: 5
inner: 5
outer: 2
global: 0
【问题讨论】:
我不知道是不是同样的情况,但是python的作用域有一个错误......见这里:twitter.com/gvanrossum/status/1354305179244392453 @OferSadan 这不是错误,它只是类定义的一个特殊功能。在这里,未绑定的本地名称在 global 范围内查找(另请参阅this answer)。这是否可取/直观是另一个问题。 【参考方案1】:每当您指定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
的范围)。
因此,如果您在vnat
中分配给x
,它将有效地分配给outer
的名称x
。
【讨论】:
以上是关于特定功能的非本地绑定的主要内容,如果未能解决你的问题,请参考以下文章