Eine Schwierigkeitsquelle bei dieser Frage ist, dass Sie ein Programm mit dem Namen haben bar/bar.py
: import bar
importiert entweder bar/__init__.py
oder bar/bar.py
, je nachdem, wo es ausgeführt wird, was es etwas umständlich macht, zu verfolgen, welches a
ist 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:a
falls gewünscht). Somit bindet Ihr from bar import a
in den __init__.py
Namen bar/__init__.py:a
an das ursprüngliche bar.py:a
Objekt ( None
). Aus diesem Grunde Sie tun können , from bar import a as a2
in __init__.py
: In diesem Fall ist es klar, dass Sie beide haben bar/bar.py:a
und 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.a
und a
).
Nun, wenn du es tust
import bar
print bar.a
Sie greifen auf eine Variable zu bar/__init__.py:a
(da import bar
Ihre 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 a
aus bar/bar.py
, die nach wie vor ist None
(wenn foobar()
definiert ist, bindet es Variablennamen ein für alle Mal, so dass der a
in bar.py
ist bar.py:a
, nicht anderea
Variable in einem anderen definierten Modul wie könnte es viele sein a
Variablen in allen importierten Module ). Daher die letzte None
Ausgabe.
Fazit: es ist am besten , jede Zweideutigkeit in zu vermeiden import bar
, indem nicht alle mit bar/bar.py
Modul (da bar.__init__.py
macht Verzeichnis bar/
ein Paket bereits, dass Sie auch mit importieren können import bar
).