2011-09-12 20 views
20

En Python, ¿hay ámbitos variables dentro de sentencias if visibles fuera de la instrucción if? (procedente de un fondo Java, por lo que resulta un poco extraño)Alcance de variable de Python en sentencias if

En el siguiente caso, el nombre se define primero dentro del bloque if pero la variable también está visible fuera del bloque if. Esperaba que ocurriera un error, pero se imprimió 'joe'.

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

Respuesta

36

if declaraciones no definen un alcance en Python.

tampoco lo hacen bucles, with declaraciones, try/except, etc.

sólo módulos, funciones y clases definen ámbitos.

Consulte Python Scopes and Namespaces en el tutorial de Python.

+0

@Owen, ¿eh? ¿referencia? –

+0

Oh ... lo siento ... estaba equivocado al respecto. – Owen

+0

@Owen está pensando en la palabra clave 'nonlocal' que asumo, que no define un alcance, solo agrega una sintaxis para referirse a un alcance que encierra pero no global. – agf

1

Todas las variables utilizadas pitón en una función viven en el ámbito de nivel de función. (Haciendo caso omiso de las variables globales y de cierre)

Es útil en casos como éste:

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

De esa manera no tengo que declarar la variable antes de la sentencia if.

+0

Su primera línea es incorrecta. Si defino una variable en una definición de clase, no está en el ámbito global, un cierre o ámbito de nivel de función. – agf

+0

@agf - las clases no definen un nuevo ámbito: no puedo acceder a las variables de clase desde un método sin calificación (es decir, necesito 'Class.thing' o' self.thing', no solo 'thing'). Sin embargo, tienen su propio espacio de nombres. – detly

+0

@agf - en realidad, ahora que lo pienso, creo que puede acceder a las variables de clase desde la definición de clase * fuera de los métodos *, así que no estoy seguro de qué es eso. – detly