如何将非本地语句与几个内部函数一起使用?

时间:2018-07-30 09:44:50

标签: python-3.x python-nonlocal

可能有人向我解释为什么此功能不起作用? “ nonlocal”语句是否应该使x中的g可以理解,因此在h中也可以理解?

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


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

编辑:我使用了非局部语言,以便不在x之外的任何地方定义g():我必须在代码中定义几个变量,并希望在函数{{1}中进行操作}。为了简便起见,我想避免在主函数中声明它们。有没有一种方法可以将先前的代码用于此目的?

2 个答案:

答案 0 :(得分:1)

来自docs

  

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

您的xnonlocal点不存在。在x = None之前尝试def g():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知道。

答案 1 :(得分:1)

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

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