2011-02-20 12 views
6

Z Python Language Reference (v 3.1, zobacz tutaj - http://docs.python.org/py3k/reference/executionmodel.html#naming-and-binding):Niezobowiązujące nazwa odwołuje zamykającego zakresu

jest nielegalne rozpiąć nazwy odwołuje się zakresem zamykającego; kompilator zgłosi błąd SyntaxError.

Ale kiedy uruchomić następujący kod:

a = 3 

def x(): 
    global a 
    del(a) 

print(a) 
x() 

działa dobrze; i kiedy zmieniam kolejność wywołań:

x() 
print(a) 

Otrzymuję NameError, a nie SyntaxError. Najwyraźniej nie rozumiem poprawnie reguły. Czy ktoś może to wyjaśnić? Dzięki.

+0

Czy możesz umieścić link do miejsca, w którym podajesz ofertę? Ta strona mówi, że należy wywołać NameError: http://docs.python.org/py3k/reference/simple_stmts.html#the-del-statement – carl

+0

@ carl: Przywieźć mi kilka osób, aby go znaleźć; kilka akapitów do http://docs.python.org/py3k/reference/executionmodel.html#naming-and-binding. –

+0

Dodano łącze do odpowiedniej sekcji w odnośniku do języka. –

Odpowiedz

3

Skontaktowałem ludzi na liście python-devel i oto co mam:

Właściwie można to zrobić teraz 3.2 lub nowszym. Usunąłem to zdanie.

Rzeczywiście, był to swego rodzaju błąd w dokumentacji.

4

Nie sądzę, że zasada dotyczy zasięgu globalnego. Globalny zasięg jest zawsze w pełni dostępny.

Oto przykład:

>>> def outer(): 
...  a=5 
...  def inner(): 
...   nonlocal a 
...   print(a) 
...   del a 
... 
SyntaxError: can not delete variable 'a' referenced in nested scope