解除封闭作用域引用的名称绑定

6 投票
2 回答
1128 浏览
提问于 2025-04-16 12:09

来自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版本及以上,你现在就可以这样做。我已经把那句话删掉了。

所以,实际上这算是文档上的一个错误。

撰写回答