2015-07-19 4 views
7

Sono un principiante Python e sono di C/C++. Sto usando Python 2.7.Python: le variabili sono ancora accessibili se definite in try o if?

Ho letto questo articolo: A Beginner’s Guide to Python’s Namespaces, Scope Resolution, and the LEGB Rule, e penso di avere una certa comprensione delle tecnologie di Python.

Oggi mi sono reso conto che posso scrivere codice Python come questo:

if condition_1: 
    var_x = some_value 
else: 
    var_x = another_value 
print var_x 

Cioè, var_x è ancora accessibile anche se è non definiscono prima il caso. Poiché provengo dallo sfondo C/C++, questo è qualcosa di nuovo per me, poiché in C/C++, var_x sono definiti nell'ambito incluso da if e else, quindi non è più possibile accedervi a meno che non si definisca var_x prima di if.

Ho provato a cercare le risposte su Google ma poiché sono ancora nuovo in Python, non so nemmeno da dove iniziare e quali parole chiave dovrei usare.

La mia ipotesi è che, in Python, if non crei un nuovo ambito. Tutte le variabili che sono state appena definite in if sono nello scope in cui si trova if ed è per questo che la variabile è ancora accessibile dopo lo if. Tuttavia, se var_x, nell'esempio sopra, è definito solo in if ma non in else, verrà emesso un avviso per dire che lo print var_x può fare riferimento a una variabile che non può essere definita.

Ho una certa fiducia nella mia comprensione. Tuttavia, qualcuno potrebbe aiutarmi a correggermi se sbaglio da qualche parte o darmi un link del documento che discute su questo?

Grazie.

+1

Sei corretto. Le variabili definite nei blocchi 'if' /' elif'/'else' sono visibili nell'oscilloscopio contenente il blocco. – MattDMo

+1

Questo vale anche per i cicli 'for' e' while', così come l'istruzione 'with'. Fondamentalmente tutto tranne funzioni e classi (puoi ancora accedere alle variabili attraverso il nome della classe: 'Cls.var'). –

+1

si può scherzare guardando ciò che è e non è in ambito con 'locals()' e 'globals()' – NightShadeQueen

risposta

10

La mia ipotesi è che, in Python, if non crei un nuovo ambito. Tutte le variabili che sono state appena definite in if sono solo nell'ambito che risiede in ed è per questo che la variabile è ancora accessibile dopo il if.

Che è corretto. In Python, namespaces, che decide essenzialmente sugli ambiti delle variabili, vengono creati solo per i moduli e le funzioni (inclusi i metodi, in pratica qualsiasi def). Quindi tutto ciò che accade all'interno di una funzione (e non in una sotto funzione) è collocato nello stesso spazio dei nomi.

È importante sapere tuttavia che la semplice esistenza di un compito all'interno di una funzione riserverà un nome nello spazio dei nomi locale. Questo rende per alcune situazioni interessanti:

def outer(): 
    x = 5 
    def inner(): 
     print(x) 
     # x = 10 
    inner() 
outer() 

Nel codice di cui sopra, con quella linea commentata, il codice stamperà 5 come ci si potrebbe aspettare. Questo perché inner cercherà nell'ambito esterno il nome x. Se si aggiunge la linea x = 10 però, il nome x sarà locale-inner, in modo che il precedente guardare in alto per x guarderà nello spazio dei nomi locale inner.Ma poiché non è stato ancora assegnato, riceverai una UnboundLocalError ("variabile locale 'x' referenziata prima dell'assegnazione"). L'istruzione nonlocal è stata aggiunta in Python 3 per risolvere un problema: La situazione in cui si desidera modificare effettivamente lo x dell'ambito esterno all'interno della funzione interna.

Per ulteriori informazioni sulla ricerca dei nomi, vedere this related question.

+0

Grazie, ed è interessante conoscere la situazione che hai citato qui .. Non ho mai saputo di questo! – yaobin