2011-02-20 3 views
6

Из Python Language Reference (V 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. По-видимому, я неправильно понимаю правило. Может ли кто-нибудь объяснить это? Благодарю.

+0

Можете ли вы связаться с тем, куда вы указываете? На этой странице должно появиться сообщение NameError: http://docs.python.org/py3k/reference/simple_stmts.html#the-del-statement – carl

+0

@carl: Мне потребовалось несколько, чтобы найти его; несколько абзацев в http://docs.python.org/py3k/reference/executionmodel.html#naming-and-binding. –

+0

Добавлена ​​ссылка на соответствующий раздел справочника по языку. –

ответ

3

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

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

Таким образом, на самом деле это была ошибка документации.

4

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

Вот пример:

>>> def outer(): 
...  a=5 
...  def inner(): 
...   nonlocal a 
...   print(a) 
...   del a 
... 
SyntaxError: can not delete variable 'a' referenced in nested scope 
Смежные вопросы