特定功能的非本地绑定

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

【讨论】:

以上是关于特定功能的非本地绑定的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript-事件

WPF。查找绑定到特定属性的控件

GHCi 中的非详尽功能模式

如何使用 AngularJS 实现粗体的非粗体功能

影响架构决策的非功能性需求

为啥C没有像javascript中的setTimeout这样的非阻塞睡眠功能