Una fuente de dificultad con esta pregunta es que tiene un programa llamado bar/bar.py: import barimporta bar/__init__.pyo bar/bar.py, dependiendo de dónde se haga, lo que hace que sea un poco engorroso rastrear cuál aes bar.a.
Así es como funciona:
La clave para comprender lo que sucede es darse cuenta de que en su __init__.py,
from bar import a
en efecto hace algo como
a = bar.a
# … where bar = bar/bar.py (as if bar were imported locally from __init__.py)
y define una nueva variable ( bar/__init__.py:a, si lo desea). Por lo tanto, su from bar import ain __init__.pyvincula el nombre bar/__init__.py:aal bar.py:aobjeto original ( None). Esta es la razón por la que puede hacerlo from bar import a as a2en __init__.py: en este caso, está claro que tiene ambos bar/bar.py:ay un nombre de variable distintobar/__init__.py:a2 (en su caso, los nombres de las dos variables resultan ser ambos a, pero aún viven en espacios de nombres diferentes: en __init__.py, son bar.ay a).
Ahora, cuando lo hagas
import bar
print bar.a
está accediendo a la variable bar/__init__.py:a(ya que import barimporta su bar/__init__.py). Esta es la variable que modificas (a 1). No está tocando el contenido de la variable bar/bar.py:a. Entonces, cuando lo hagas posteriormente
bar.foobar()
usted llama bar/bar.py:foobar(), que accede a la variable adesde bar/bar.py, que sigue siendo None(cuando foobar()se define, enlaza los nombres de las variables de una vez por todas, por lo que el ain bar.pyes bar.py:a, no cualquier otra avariable definida en otro módulo, ya que puede haber muchas avariables en todos los módulos importados ). De ahí la última Nonesalida.
Conclusión: es mejor evitar cualquier ambigüedad import baral no tener ningún bar/bar.pymódulo (ya bar.__init__.pyque el directorio ya es bar/un paquete, con el que también puedes importar import bar).