如何使用具有多个内部函数的非本地语句?
Posted
技术标签:
【中文标题】如何使用具有多个内部函数的非本地语句?【英文标题】:How to use nonlocal statement with several inner functions? 【发布时间】:2019-01-06 12:57:42 【问题描述】:有人能解释一下为什么这个功能不起作用吗? “非本地”语句不应该使x
在g
中可以理解,因此在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
语句中列出的名称不同,它必须引用封闭范围内的预先存在的绑定(无法明确确定应创建新绑定的范围)。
您的x
在nonlocal
处并不预先存在。在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
在这种情况下,f
和 g
不知道 x
,而 h
、i
和 j
知道。
【讨论】:
有人可能会补充说,全局命名空间在这里不算作封闭范围。将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 的页面呢?