范围 – Python的非本地取决于层次结构的级别?

范围 – Python的非本地取决于层次结构的级别?,第1张

概述这个问题是 a question about Python variable scope的后续问题.其他问题 q1, q2和 answers可以在SO上找到,甚至更多. 官方 Python documentation和 PEP 3104应该解释细节,但它们对我来说似乎并不完全不言自明. 我试图解决的主题是通过在一级层次结构上/下移动该代码来重构包含非本地/全局的代码. 我不明白的是Python参考 这个问题是 a question about Python variable scope的后续问题.其他问题 q1,q2和 answers可以在SO上找到,甚至更多.
官方 Python documentation和 PEP 3104应该解释细节,但它们对我来说似乎并不完全不言自明.

我试图解决的主题是通过在一级层次结构上/下移动该代码来重构包含非本地/全局的代码.

我不明白的是Python参考中这句话的含义:

names Listed in a nonlocal statement,unlike to those Listed in a
global statement,must refer to pre-existing bindings in an enclosing
scope (the scope in which a new binding should be created cannot be
determined unambiguously).

给出以下全局范围的代码:

var = 0def outer():    global var                  # line A    var = 1    def inner():        nonlocal var            # line B        var = 2        print('inner:',var)    inner()    print('outer:',var)outer()print('main:',var)

执行会引发错误:

SyntaxError: no binding for nonlocal 'var' found

代码可以工作(当然,如果任何一行A被注释掉,则会有不同的语义:

inner: 2outer: 2main: 0

或B行被注释掉:

inner: 2outer: 1main: 1

但是,在上面的例子中,由于nonlocal应该将var绑定到“封闭范围”,我希望A行将外部/ var绑定到全局范围,然后B行查找外部/ var并重新绑定内部/ var to global / var.相反它似乎根本找不到它(由于A线中的重新绑定,我猜)并引发错误.

我期望的结果是:

inner: 2outer: 2main: 2

这只是Python中范围界定令人困惑的另一个例子吗?

或者,为了使这成为一个建设性的问题:

>如何以一种函数所在的方式编写这样一个例子(必须与非本地交换全局,反之亦然)?
>如果函数驻留在中间层和未知层次结构中,那么outer()的作者如何更改最外层(在本例中为全局)级别和内部()级别都不必触及的代码? –

在我对语言的谦虚理解中,这些结构(对闭包的依赖)只是要避免.其他人已经建议使用其他语言功能(classes,func attrs)来实现这种上下文敏感性.

解决方法 全局和非本地并不意味着要结合起来.他们的意思不同:

> global表示名称存在于模块级别
> nonlocal表示名称存在于外部词法函数范围中

你得到原始异常的原因是因为你告诉Python var是非本地的(意思是它在外部函数定义中),但是在任何外部函数定义中都没有var的函数级绑定,因为你在外部告诉Python var是全局的函数.

总结

以上是内存溢出为你收集整理的范围 – Python的非本地取决于层次结构的级别?全部内容,希望文章能够帮你解决范围 – Python的非本地取决于层次结构的级别?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1207119.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存