Bu soru ile zorluk kaynaklarından biri adlı bir program var olmasıdır bar/bar.py: import barithalat ya bar/__init__.pyya bar/bar.pyda biraz hantal hangi izlemek için yapar yapılır yere bağlı olarak aise bar.a.
Şu şekilde çalışır:
Ne anlamanın anahtarı Gözlerinde farklı olduğunu fark etmektir __init__.py,
from bar import a
aslında şöyle bir şey yapar
a = bar.a
ve yeni bir değişken tanımlar ( bar/__init__.py:aisterseniz). Böylece, from bar import ain __init__.pyadınız bar/__init__.py:aorijinal bar.py:anesneye ( None) bağlanır . Yapabileceğiniz Bu yüzden from bar import a as a2de __init__.py: bu durumda, bu durum sizin de sahip olduğu açıktır bar/bar.py:ave bir ayrı değişken adı bar/__init__.py:a2sizin durumunuzda (iki değişken isimleri sadece ikisi olarak gerçekleşmesi a, ama yine de canlı farklı ad alanlarında bunlar: Giriş __init__.py, onlar bar.ave a).
Şimdi, ne zaman yaparsan
import bar
print bar.a
değişkene erişiyorsunuz bar/__init__.py:a(çünkü import barsizin değişkeninizi içe aktarıyor bar/__init__.py). Bu, değiştirdiğiniz değişkendir (1'e). Değişkenin içeriğine dokunmuyorsunuz bar/bar.py:a. Yani daha sonra yaptığında
bar.foobar()
Aradığınızda bar/bar.py:foobar()değişken erişen hangi aden bar/bar.pyhala hangi Nonezaman ( foobar()tanımlanmaktadır böylece, bu, ilk ve son olarak değişken isimleri bağlayan aiçinde bar.pyolan bar.py:aherhangi bir başka değil, açok var olabilecek başka tanımlanan değişken modül-olarak atüm ithal modüllerde değişkenleri ). Dolayısıyla son Noneçıktı.
Sonuç: herhangi bir karışıklıkları önlemek en iyisidir import bartarafından, değil herhangi sahip bar/bar.py(beri modülü bar.__init__.pymarkaları dizinine bar/da içe ki, bir paket zaten import bar).