Salah satu sumber kesulitan dengan pertanyaan ini adalah bahwa Anda memiliki sebuah program bernama bar/bar.py
: import bar
impor baik bar/__init__.py
atau bar/bar.py
, tergantung di mana hal itu dilakukan, yang membuatnya sedikit rumit untuk melacak yang a
merupakan bar.a
.
Berikut cara kerjanya:
Kunci untuk memahami apa yang terjadi adalah dengan menyadari bahwa dalam __init__.py
,
from bar import a
pada dasarnya melakukan sesuatu seperti
a = bar.a
# … where bar = bar/bar.py (as if bar were imported locally from __init__.py)
dan mendefinisikan variabel baru ( bar/__init__.py:a
, jika Anda mau). Jadi, nama from bar import a
in __init__.py
mengikat Anda bar/__init__.py:a
ke bar.py:a
objek asli ( None
). Inilah mengapa Anda dapat melakukannya from bar import a as a2
di __init__.py
: dalam kasus ini, jelas bahwa Anda memiliki keduanya bar/bar.py:a
dan nama variabel yang berbedabar/__init__.py:a2
(dalam kasus Anda, nama kedua variabel kebetulan saja keduanya a
, tetapi mereka masih hidup di ruang nama yang berbeda: di __init__.py
, mereka bar.a
dan a
).
Sekarang, saat Anda melakukannya
import bar
print bar.a
Anda mengakses variabel bar/__init__.py:a
(karena import bar
mengimpor Anda bar/__init__.py
). Ini adalah variabel yang Anda ubah (menjadi 1). Anda tidak menyentuh isi variabel bar/bar.py:a
. Jadi saat Anda selanjutnya melakukannya
bar.foobar()
Anda memanggil bar/bar.py:foobar()
, yang mengakses variabel a
dari bar/bar.py
, yang masih None
(ketika foobar()
ditentukan, itu mengikat nama variabel sekali dan untuk semua, jadi a
in bar.py
adalah bar.py:a
, bukan a
variabel lain yang ditentukan dalam modul lain — karena mungkin ada banyak a
variabel di semua modul yang diimpor ). Karenanya None
keluaran terakhir .
Kesimpulan: yang terbaik adalah menghindari ambiguitas apa pun import bar
, dengan tidak memiliki bar/bar.py
modul apa pun (karena bar.__init__.py
membuat direktori sudah bar/
menjadi paket, yang juga dapat Anda impor import bar
).