Вы можете думать о пакете как о диктовке. Каждая функция и переменная в пакете указываются в качестве ключа в этой инструкции, которую вы можете просмотреть, используя globals()
.
Когда вы импортируете объект из другого пакета, вы копируете ссылку на объект в свой собственный пакет под именем (обычно одинаковым, другим, если вы import <var> as <name>
).
Установкой значение в другом пакете, вы перезаписываете ключ в этом пакете новым значением, но оставляете ссылку на старое.
Аналогия с dicts
Мы можем продемонстрировать процесс с использованием dicts в качестве аналогии:
# Our 'packages'
one = {'x': 'start'}
two = {}
# Equivalent of our import
two['x'] = one['x']
# Variable updated in `one'
one['x'] = 'updated'
# ... and accessed in `two`
print(two['x']) # Still 'start'
Мы не ожидаем, что диктат two
будет обновлен только потому, что мы перезаписали значение в one
.
Что вы можете сделать с it
Вы можете изменять объект до тех пор, пока вы не сломаете указатель, переписав переменную. Например, если x
был диктом, вы могли бы изменить значение внутри dict, и две переменные по-прежнему указывали бы на один и тот же объект.
В качестве альтернативы вы могли бы присоединить переменные к функции следующим образом:
def change(value):
change.x = value
Это делает ту же самую работу, гарантируя, что мы мутируем один и тот же объект.
Лучшим ответом может быть завершение обоих предметов в объекте, если им нужно путешествовать вместе:
class Changer:
x = 'start'
@classmethod
def change(cls, value):
cls.x = value
Однако в этот момент мы можем изменить значение непосредственно как атрибут:
Changer.x = 'updated'
Что может быть самым простым.