Функция get_base_page
имеет свое собственное пространство имен, поэтому между двумя переменными s
не будет никаких помех.
Вы можете получить доступ к глобальным переменным из функции get_base_page
. Но если вы хотите присвоить им значение, вам необходимо объявить их как global
. В противном случае они будут созданы в локальном пространстве имен функций, как это происходит в вашем случае.
См this статьи хорошего учебника о пространствах имен и сфере применения (LEGB правило)
Чтения своего вопроса еще раз, я думаю, что дело нам нужно выяснить, как объект s
сохраняются как значение ключа с именем session
в словаре d
.
Теперь запустите питон и выполните следующие действия (>>> есть питон строка):
>>> s = 42
>>> d = {'session': s, 'key2': 8}
>>> d
{'key2': 8, 'session': 42}
>>> s = 3
>>> d
{'key2': 8, 'session': 42}
Когда вы говорите s = 3
, вы говорите питону, чтобы сделать точку s
имени в/указать значение 3
, Вы не переписываете само значение.
Теперь давайте сделаем то же самое с родовым объектом класса мы определяем:
>>> class A(object):
... def __init__(self, n):
... self.n = n
...
>>> s = A(42)
>>> d = {'session': s, 'key2': 8}
>>> d['session'].n
42
>>> s.n = 30
>>> d['session'].n
30
разницу? Имя s
и ключ session
указывают/указывают один и тот же экземпляр объекта. Поэтому, когда вы меняете свои атрибуты (достигая их через любое имя), это изменение повлияет на оба.
Обратитесь к статье this за неизменяемые/изменяемые объекты.
Практика со всеми типами python и посмотреть, что произойдет. Повеселись!
Спасибо за объяснение! – user61629