cfi*_*cfi 10 closures scope python-3.x
这个问题是关于Python变量范围的问题的后续问题.其他问题q1,q2和答案可以在SO上找到,甚至更多.官方Python文档和PEP 3104应该解释细节,但它们对我来说似乎并不完全不言自明.
我试图解决的主题是重构包含nonlocal/ global通过在一级层次结构上/下移动该代码的代码.
我不明白的是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)
Run Code Online (Sandbox Code Playgroud)
执行会引发错误:
SyntaxError: no binding for nonlocal 'var' found
Run Code Online (Sandbox Code Playgroud)
代码可以工作(当然,如果任何一行A被注释掉,则会有不同的语义:
inner: 2
outer: 2
main: 0
Run Code Online (Sandbox Code Playgroud)
或B行被注释掉:
inner: 2
outer: 1
main: 1
Run Code Online (Sandbox Code Playgroud)
但是,在上面的例子中,并且因为nonlocal应该将var绑定到"封闭范围",我会预期A行将外部/ var绑定到全局范围,然后B行查找外部/ var并重新绑定内部/ var到global/var.相反它似乎根本找不到它(由于A线中的重新绑定,我猜)并引发错误.
我期望的结果是:
inner: 2
outer: 2
main: 2
Run Code Online (Sandbox Code Playgroud)
这只是Python中范围界定令人困惑的另一个例子吗?
或者,为了使这成为一个建设性的问题:
global与之交换,nonlocal反之亦然)无关紧要的方式编写这样的示例?outer()更改代码,既不是最外层(在本例中为全局),也不是inner()必须触及层次?-在我对语言的谦虚理解中,这些结构(对闭包的依赖)只是要避免.其他人已经建议使用其他语言功能(类,func attrs)来实现这种上下文敏感性.
Eth*_*man 13
global而nonlocal并不意味着相结合.他们的意思不同:
global 表示名称存在于模块级别nonlocal 表示名称存在于外部词法函数范围中你得到原始异常的原因是因为你告诉Python var是非本地的(意思是它在外部函数定义中),但在任何外部函数定义中都没有函数级绑定,var因为你在外部函数中告诉Python var是全球的.
| 归档时间: |
|
| 查看次数: |
10382 次 |
| 最近记录: |