Jednym ze źródeł trudności z tym pytaniem jest to, że masz program o nazwie bar/bar.py: import barimportu albo bar/__init__.pyalbo bar/bar.py, w zależności od tego, gdzie to jest zrobione, co sprawia, że jest to trochę kłopotliwe, aby śledzić, które ajest bar.a.
Oto jak to działa:
Kluczem do zrozumienia tego, co się dzieje, aby uświadomić sobie, że w twojej __init__.py,
from bar import a
w efekcie robi coś podobnego
a = bar.a
# … where bar = bar/bar.py (as if bar were imported locally from __init__.py)
i definiuje nową zmienną ( bar/__init__.py:ajeśli chcesz). W ten sposób twój from bar import ain __init__.pywiąże nazwę bar/__init__.py:az oryginalnym bar.py:aobiektem ( None). Dlatego możesz to zrobić from bar import a as a2w __init__.py: w tym przypadku jest jasne, że masz obie bar/bar.py:ai odrębną nazwę zmiennej bar/__init__.py:a2(w twoim przypadku nazwy dwóch zmiennych po prostu są a, ale nadal istnieją w różnych przestrzeniach nazw: w __init__.py, są bar.ai a).
Teraz, kiedy to zrobisz
import bar
print bar.a
uzyskujesz dostęp do zmiennej bar/__init__.py:a(ponieważ import barimportuje twoją bar/__init__.py). To jest zmienna, którą modyfikujesz (do 1). Nie dotykasz zawartości zmiennej bar/bar.py:a. Więc kiedy później to zrobisz
bar.foobar()
wywołujesz bar/bar.py:foobar(), która uzyskuje dostęp do zmiennej az bar/bar.py, która jest nadal None(gdy foobar()jest zdefiniowana, wiąże nazwy zmiennych raz na zawsze, więc ain bar.pyjest bar.py:a, a nie żadna inna azmienna zdefiniowana w innym module - ponieważ może być wiele azmiennych we wszystkich zaimportowanych modułach ). Stąd ostatnie Nonewyjście.
Wniosek: najlepiej jest uniknąć wszelkich niejasności import bar, nie mając żadnego bar/bar.pymodułu (ponieważ bar.__init__.pysprawia, że katalog bar/jest już pakietem, za pomocą którego można również importować import bar).