0

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

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


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

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

4

2 回答 2

1

来自文档

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

x在 的点上并不预先存在nonlocal。尝试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

在这种情况下,fand gdon't know ,xwhile和do。hij

于 2018-07-30T09:48:01.233 回答
1

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

>>> def f():
...   def g():
...     f.a = 5
...   def h():
...     print(f.a)
...   g()
...   h()
... 
>>> f()
5
于 2018-07-30T10:09:05.673 回答