解除封闭作用域引用的名称绑定
来自Python语言参考手册(版本3.1,查看这里 - http://docs.python.org/py3k/reference/executionmodel.html#naming-and-binding):
在一个外部作用域中,如果试图解除一个名字的绑定,这是不合法的;编译器会报SyntaxError(语法错误)。
但是,当我运行以下代码时:
a = 3
def x():
global a
del(a)
print(a)
x()
它运行得很好;而当我改变调用的顺序时:
x()
print(a)
我得到了NameError(名字错误),而不是SyntaxError(语法错误)。显然,我对这个规则的理解不太正确。有人能解释一下吗?谢谢。
2 个回答
4
我觉得这个规则不适用于全局范围。全局范围总是可以完全访问的。
这里有一个例子:
>>> def outer():
... a=5
... def inner():
... nonlocal a
... print(a)
... del a
...
SyntaxError: can not delete variable 'a' referenced in nested scope
3
我联系了python-devel邮件列表上的人,得到了这样的回复:
其实在3.2版本及以上,你现在就可以这样做。我已经把那句话删掉了。
所以,实际上这算是文档上的一个错误。