可能有人向我解释为什么此功能不起作用? “ 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}中进行操作}。为了简便起见,我想避免在主函数中声明它们。有没有一种方法可以将先前的代码用于此目的?
答案 0 :(得分:1)
来自docs:
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
在这种情况下,f
和g
不知道x
,而h
,i
和j
知道。
答案 1 :(得分:1)
不确定所尝试的内容是否真的有助于提高可读性。如果要结构化代码,则可能需要考虑使用类和(实例)属性。话虽如此,如果您想避免多个赋值行,则可以使用外部函数的属性:
>>> def f():
... def g():
... f.a = 5
... def h():
... print(f.a)
... g()
... h()
...
>>> f()
5