Да, ваши наблюдения верны.Это является следствием того, как привязка работает в Python.
Когда кто-то делает
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
Тогда это изменение будет распространено на другие импортирующие модули, поскольку один не перезаписывает глобальная ссылка, но следующая , чтобы изменить атрибут объекта, на который она указывает.По сути, вы должны иметь возможность изменять изменяемые объекты, если вы не перезаписываете глобальную привязку.
Я думаю, что что-то вроде этого является наиболее близким к тому, что вы сможете чисто добраться додействительно глобальный в питоне.Как язык, он очень ценит пространства имен.