2011-09-12 14 views
20

In Python, gli ambiti delle variabili all'interno delle istruzioni if ​​sono visibili al di fuori dell'istruzione if? (proveniente da uno sfondo Java, quindi trova un po 'strano)Ambito variabile Python nelle istruzioni if ​​

Nel seguente caso, il nome viene prima definito all'interno del blocco if, ma la variabile è visibile anche al di fuori del blocco if. Mi aspettavo che si verificasse un errore, ma "joe" viene stampato.

if 1==1: 
    name = 'joe' 
print(name) 

risposta

36

if le istruzioni non definiscono un ambito in Python.

Nemmeno loop, with dichiarazioni, try/except, ecc

solo moduli, funzioni e classi definiscono ambiti.

Vedere Python Scopes and Namespaces nell'esercitazione Python.

+0

@Owen, eh? riferimento? –

+0

Oh ... mi dispiace .. mi sono sbagliato su questo. – Owen

+0

@Owen stai pensando alla parola chiave 'nonlocal' che presumo, che non definisce un ambito, ma aggiunge una sintassi per riferirsi a un ambito che include ma non globale. – agf

1

Tutte le variabili di pitone utilizzata in una funzione vivono nel campo di applicazione del livello di funzione. (Ignorando le variabili globali e di chiusura)

E 'utile in caso come questo:

if foo.contains('bar'): 
    value = 2 + foo.count('b') 
else: 
    value = 0 

In questo modo non devo dichiarare la variabile prima l'istruzione if.

+0

La prima riga non è corretta. Se definisco una variabile in una definizione di classe non è nell'ambito di portata globale, a chiusura o ambito di funzione. – agf

+0

@agf: le classi non definiscono un nuovo ambito: non posso accedere alle variabili di classe da un metodo senza qualifica (ad esempio, ho bisogno di 'Class.thing' o' self.thing', non solo 'thing'). Hanno il loro spazio dei nomi, però. – detly

+0

@agf - in realtà, ora che ci penso, credo che sia possibile accedere alle variabili di classe dalla definizione di classe * al di fuori dei metodi *, quindi non sono sicuro di cosa sia. – detly