Eine Schwierigkeitsquelle bei dieser Frage ist, dass Sie ein Programm mit dem Namen haben bar/bar.py: import barimportiert entweder bar/__init__.pyoder bar/bar.py, je nachdem, wo es ausgeführt wird, was es etwas umständlich macht, zu verfolgen, welches aist bar.a.
So funktioniert es:
Der Schlüssel zum Verständnis dessen, was passiert, ist zu erkennen, dass in Ihrem __init__.py,
from bar import a
in der Tat macht so etwas
a = bar.a
# … where bar = bar/bar.py (as if bar were imported locally from __init__.py)
und definiert eine neue Variable ( bar/__init__.py:afalls gewünscht). Somit bindet Ihr from bar import ain den __init__.pyNamen bar/__init__.py:aan das ursprüngliche bar.py:aObjekt ( None). Aus diesem Grunde Sie tun können , from bar import a as a2in __init__.py: In diesem Fall ist es klar, dass Sie beide haben bar/bar.py:aund ein eindeutigen Variablennamen bar/__init__.py:a2(in Ihrem Fall die Namen der beiden Variablen nur zufällig auf beides sein a, aber sie lebt noch in einer anderen Namensraum: in __init__.py, sie sind bar.aund a).
Nun, wenn du es tust
import bar
print bar.a
Sie greifen auf eine Variable zu bar/__init__.py:a(da import barIhre importiert wird bar/__init__.py). Dies ist die Variable, die Sie ändern (auf 1). Sie berühren den Inhalt der Variablen nicht bar/bar.py:a. Also, wenn Sie es später tun
bar.foobar()
Sie rufen bar/bar.py:foobar(), die Variable zugreift aaus bar/bar.py, die nach wie vor ist None(wenn foobar()definiert ist, bindet es Variablennamen ein für alle Mal, so dass der ain bar.pyist bar.py:a, nicht anderea Variable in einem anderen definierten Modul wie könnte es viele sein aVariablen in allen importierten Module ). Daher die letzte NoneAusgabe.
Fazit: es ist am besten , jede Zweideutigkeit in zu vermeiden import bar, indem nicht alle mit bar/bar.pyModul (da bar.__init__.pymacht Verzeichnis bar/ein Paket bereits, dass Sie auch mit importieren können import bar).