Отмена привязки имени, на которое ссылается окружающая область - PullRequest
6 голосов
/ 20 февраля 2011

Из справочника по языку Python (v 3.1, см. Здесь - http://docs.python.org/py3k/reference/executionmodel.html#naming-and-binding):

Недопустимо отвязывать имя, на которое ссылается окружающая область; компилятор сообщит о синтаксической ошибке.

Но когда я запускаю следующий код:

a = 3

def x():
  global a
  del(a)

print(a)
x()

работает нормально; и когда я меняю порядок звонков:

x()
print(a)

Я получаю NameError, а не SyntaxError. Видимо, я не правильно понимаю правило. Кто-нибудь может это объяснить? Благодарю.

Ответы [ 2 ]

4 голосов
/ 20 февраля 2011

Я не думаю, что это правило применимо к глобальной области. Глобальная область действия всегда полностью доступна.

Вот пример:

>>> def outer():
...     a=5
...     def inner():
...         nonlocal a
...         print(a)
...         del a
...
SyntaxError: can not delete variable 'a' referenced in nested scope
3 голосов
/ 01 марта 2011

Я связался с людьми из списка python-devel, и вот что я получил:

На самом деле вы можете сделать это сейчас 3.2+.Теперь я удалил это предложение.

Итак, на самом деле это была ошибка с документацией.

...