예, 관찰 결과가 정확합니다. 이것은 바인딩이 파이썬에서 작동하는 방식의 결과입니다.
하나가하는
import foo
는 foo
모듈 foo
를 참조하는 전역 이름이됩니다. 그럴 때
foo.bar = 7
다음에 참조 번호와 객체 foo
이로드됩니다. 그런 다음 7
은 bar
속성에 저장됩니다.
다른 모듈이 foo
을 가져 오면 sys.modules['foo']
에서 개체를 가져 와서 수정 된 값을 가져옵니다. 하나 않으면
는
from foo import bar
globals()['bar']
는 foo.bar
를 참조하도록 설정되어있다. 하나 나중에
bar = 7
globals()['bar']
을 수행 할 때 더 이상 foo.bar
하지만 참조 7
의 사본을 참조하지 않습니다. 즉, 가져 오기 모듈의 전역 범위에서 원래 바인딩은 간단히 대체됩니다.
첫 번째 예제에서는 sys.modules
에 저장된 개체의 특성을 수정하고 가져온 모든 모듈에 공통으로 적용됩니다. 두 번째 예에서는 가져 오기 모듈의 전역 범위를 수정합니다.
하나가 수정을 다음 전역 참조하지만 을 덮어하지 때문에 하나는 그 변화 이 다른 가져 오기 모듈에 전달 될 그런
from foo import fobaz
fobaz.foobar = 7
의 라인을 따라 뭔가를했다면 객체가 가리키는 속성. 따라서 기본적으로 전역 바인딩을 덮어 쓰지 않는 한 변경 가능한 개체를 수정할 수 있어야합니다.
저는이 점이 여러분이 파이썬에서 진정한 글로벌 환경에 깨끗하게 도달 할 수 있다고 생각합니다. 언어로서, 그것은 네임 스페이스를 매우 중요하게 생각합니다.
와우 나는 이것을 몰랐다. 좋은 대답. – invert