2011-01-23 9 views
20

de alguna manera estaba sorprendido por el comportamiento siguiente:__main__ y de alcance en Python

def main(): 
    print "%s" % foo 

if __name__ == "__main__": 
    foo = "bar" 
    main() 

es decir, un módulo de función tiene acceso a las variables que encierra en el __main__. ¿Cuál es la explicación para eso?

+3

No hay alcance '__main__'. Hay un 'si' que pasa al comparar una variable que pasa a llamarse' __name__' a algo que pasa a ser la cadena literal '" __main __ "'. – delnan

+0

@delnan: '__main__' es un módulo, y cada módulo tiene un alcance asociado. Prueba 'import __main__; escriba (__ main __) 'en el intérprete (no en IPython). –

+0

@Sven: Lo sé. OP debería saber en algún momento. Pero me pareció que OP en su lugar confunde las afirmaciones con partes de la condición y piensa que "si" introduce un nuevo alcance, que sería un problema más apremiante. (Es cierto que "no hay alcance" __main__ "es engañoso, en sentido estricto) – delnan

Respuesta

20

Las variables en el alcance global actual de los módulos están visibles en todas partes del módulo; esta regla también se aplica al módulo __main__.

De Guido's tutorial:

En cualquier momento durante la ejecución, hay al menos tres ámbitos anidados cuyos espacios de nombres son directamente accesibles:

  • el alcance más interna, que se busca primero, contiene el local de nombres
  • los alcances de las funciones de cerramiento, que se buscan empezando por el ámbito que contiene más cercana , contiene no local, sino también nombres no globales
  • la penúltima ámbito contiene los nombres globales del módulo actual
  • el alcance más externa (buscado última) es el espacio de nombres que contiene una función de nombres
+0

'__main__' * module *? – user225312

+0

@AA: Python considera el script principal como un módulo con el nombre '__main__'. Incluso puede hacer' import __main__' (pero generalmente esa es una Idea Mala). –

6

foo es una variable global del módulo (no tiene ninguna función). Todos los ámbitos dentro del módulo pueden acceder a él.

2

en Python está el ámbito global y funciones tener sus propios alcances Entonces, usted define foo bajo el nombre == main, está en el alcance global. Además, no es un error utilizar una variable que aún no se haya declarado en una función, si se declarará antes de que se llame a la función.

4

La cosa aquí es que:

if __name__ == "__main__": 
    foo = "bar" 

define una variable global llamada foo en ese guión. entonces cualquier función de ese módulo tendrá acceso a ella.

La pieza de código enumerada anteriormente es global para el módulo y no está dentro de ninguna función.