如何使用具有多个内部函数的非本地语句?

Posted

技术标签:

【中文标题】如何使用具有多个内部函数的非本地语句?【英文标题】:How to use nonlocal statement with several inner functions? 【发布时间】:2019-01-06 12:57:42 【问题描述】:

有人能解释一下为什么这个功能不起作用吗? “非本地”语句不应该使xg 中可以理解,因此在h 中可以理解吗?

def f():
    def g():
        nonlocal x
        x= 1
    def h():
        print(x)


>>> SyntaxError: no binding for nonlocal 'x' found

编辑:我使用 nonlocal 是为了不在g() 以外的任何地方定义x:我必须在我的代码中定义几个变量,并希望在函数init_var() 中进行。为了方便起见,我想避免在我的主要功能中声明它们。有没有办法调整以前的代码来达到这个目的?

【问题讨论】:

【参考方案1】:

来自docs:

nonlocal 语句中列出的名称与global 语句中列出的名称不同,它必须引用封闭范围内的预先存在的绑定(无法明确确定应创建新绑定的范围)。

您的xnonlocal 处并不预先存在。在def g(): 之前尝试x = None 以创建一个绑定供nonlocal 引用。

文档所述的歧义问题很容易在这里看到:

def f():
    def g():
        def h():
            def i():
                def j():
                    nonlocal x

哪些函数应该可以访问x,哪些不应该?另一方面,这里很清楚:

def f():
    def g():
        def h():
            x = None
            def i():
                def j():
                    nonlocal x

在这种情况下,fg 不知道 x,而 hij 知道。

【讨论】:

有人可能会补充说,全局命名空间在这里不算作封闭范围。将 x = None 放在函数 f 之外会失败。 感谢这个非常明确的答案。我编辑了我的问题,因为我想知道是否有办法避免这个x = None 声明,(为了代码的易读性) 我想不出办法。使用值设置字典或对象要容易得多;设置单个变量很困难,因为它们是通过静态分析检查的。【参考方案2】:

不确定您正在尝试的内容是否真的有助于提高可读性。如果您想结构化您的代码,您可能需要考虑使用类和(实例)属性。话虽这么说,如果你想避免多行赋值,你可以使用外部函数的属性:

>>> def f():
...   def g():
...     f.a = 5
...   def h():
...     print(f.a)
...   g()
...   h()
... 
>>> f()
5

【讨论】:

好的,非常感谢!只是一个问题:你已经回答了第二个问题,@Amadan 第一个问题,是否可以连接两个答案以便我接受答案?

以上是关于如何使用具有多个内部函数的非本地语句?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mysqli 准备语句中使用多个内部连接和多个 WHERE 子句? [复制]

R语言deLong‘s test:使用自定义函数检验两个ROC曲线的差异是否具有统计显著性比较两个或多个相关ROC曲线的AUC的非参数检验

如何使用 javascript 从 iframe 内部获取 iframe 的高度?具有多个 iframe 的页面呢?

如何改进具有多个子查询的 SELECT 语句

当元素具有多个类时如何在 switch 语句中检查 className

如何使用具有关联类型的非静态特征对象?