2011-02-20 6 views
6

Dal Python di riferimento del linguaggio (v 3.1, vedi qui - http://docs.python.org/py3k/reference/executionmodel.html#naming-and-binding):Nibbana un nome a cui fa riferimento un ambito di inclusione

È illegale separare un nome a cui fa riferimento un campo di applicazione che racchiude; il compilatore segnalerà un SyntaxError.

Ma quando ho eseguito il seguente codice:

a = 3 

def x(): 
    global a 
    del(a) 

print(a) 
x() 

funziona benissimo; e quando cambio l'ordine delle chiamate:

x() 
print(a) 

ho un NameError, non uno SyntaxError. Apparentemente, non sto capendo correttamente la regola. Qualcuno può spiegarlo? Grazie.

+0

Puoi collegarti a dove citi? Questa pagina dice che dovrebbe essere sollevato un NameError: http://docs.python.org/py3k/reference/simple_stmts.html#the-del-statement – carl

+0

@carl: Ci sono voluti alcuni per trovarlo anche tu; diversi paragrafi in http://docs.python.org/py3k/reference/executionmodel.html#naming-and-binding. –

+0

Aggiunto il collegamento alla sezione appropriata del riferimento alla lingua. –

risposta

3

ho contattato le persone nella lista python-devel e qui è quello che ho ottenuto:

In realtà è possibile farlo ora 3.2+. Ora ho rimosso quella frase.

Quindi, in realtà si trattava di un errore di documentazione.

4

Non penso che la regola si applichi allo scopo globale. L'ambito globale è sempre completamente accessibile.

Ecco un esempio:

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