范围 – Python的非本地取决于层次结构的级别?
这个问题是
a question about Python variable scope的后续问题.其他问题
q1,q2和
answers可以在SO上找到,甚至更多.
我试图解决的主题是通过在一级层次结构上/下移动该代码来重构包含非本地/全局的代码. 我不明白的是Python参考中这句话的含义:
给出以下全局范围的代码: var = 0 def 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: 2 outer: 2 main: 0 或B行被注释掉: inner: 2 outer: 1 main: 1 但是,在上面的例子中,由于nonlocal应该将var绑定到“封闭范围”,我希望A行将外部/ var绑定到全局范围,然后B行查找外部/ var并重新绑定内部/ var to global / var.相反它似乎根本找不到它(由于A线中的重新绑定,我猜)并引发错误. 我期望的结果是: inner: 2 outer: 2 main: 2 这只是Python中范围界定令人困惑的另一个例子吗? 或者,为了使这成为一个建设性的问题: >如何以一种函数所在的方式编写这样一个例子(必须与非本地交换全局,反之亦然)? 在我对语言的谦虚理解中,这些结构(对闭包的依赖)只是要避免.其他人已经建议使用其他语言功能(classes,func attrs)来实现这种上下文敏感性. 解决方法全局和非本地并不意味着要结合起来.他们的意思不同:> global表示名称存在于模块级别 你得到原始异常的原因是因为你告诉Python var是非本地的(意思是它在外部函数定义中),但是在任何外部函数定义中都没有var的函数级绑定,因为你在外部告诉Python var是全局的函数. (编辑:甘南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |