이 질문에 어려움 중 하나는 소스라는 이름의 프로그램을 가지고있다 bar/bar.py: import bar수입하거나 bar/__init__.py또는 bar/bar.py이 조금 성가신를 추적 할 수있는 완료 위치에 따라 a입니다 bar.a.
작동 방식은 다음과 같습니다.
무슨 일이 일어나는지 이해하는 열쇠는 당신의 __init__.py,
from bar import a
사실상 다음과 같은 일을한다
a = bar.a
# … where bar = bar/bar.py (as if bar were imported locally from __init__.py)
새 변수를 정의합니다 ( bar/__init__.py:a원하는 경우). 따라서 from bar import ain __init__.py은 이름 bar/__init__.py:a을 원래 bar.py:a개체 ( None) 에 바인딩 합니다 . 당신이 할 수있는 이유입니다 from bar import a as a2에서 __init__.py:이 경우, 당신이 모두있는 것이 분명 bar/bar.py:a하고 뚜렷한 변수 이름 bar/__init__.py:a2귀하의 경우를 (두 변수의 이름은 둘 다 될 일이 a,하지만 여전히 라이브 서로 다른 네임 스페이스에서 그들은 :에 __init__.py, 그들은 bar.a및 a)입니다.
이제 할 때
import bar
print bar.a
변수에 액세스하고 있습니다 bar/__init__.py:a(을 import bar가져 오기 때문에 bar/__init__.py). 이것은 수정하는 변수입니다 (1로). 변수의 내용을 건드리지 않습니다 bar/bar.py:a. 그래서 나중에 할 때
bar.foobar()
당신이 전화를 bar/bar.py:foobar()변수에 액세스하는, a에서 bar/bar.py여전히있는이 None때 ( foobar()정의되는, 그래서 그것은, 한 번 모든 변수 이름을 결합 a에서이 bar.py있다 bar.py:a다른, 아니 a많은이있을 수 있습니다 또 다른 정의 변수 모듈이-로 a가져온 모든 모듈의 변수 ). 따라서 마지막 None출력입니다.
결론 : 그것은 어떤 모호성을 피하기 위해 최선 import bar에 의해, 아니 어떤 데 bar/bar.py(이후 모듈 bar.__init__.py차종 디렉토리를 bar/당신도 함께 가져올 수있는, 패키지 이미 import bar).