@Hitreno

Как это чудо работает (Функция обрабатывает глобальную переменную)?

Нашёл на Гите один пример к либе, удивился. Решил писать автору об ошибке, но сначала запустил, и, о чудо, это заработало. Объясните пожалуйста как это работает кто понимает.
P.s. Значения случайны
diction={365:1}
def a():
    x=diction
    x.update({365:5})
def b():
    x=diction
    print(x[365])
a()
b() # выводит 5
print(diction[365]) # тоже выводит 5
  • Вопрос задан
  • 68 просмотров
Решения вопроса 3
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
Вы работаете с одной и той же областью данных:
>>> diction={365:1}
>>> print(id(diction))
4478940144
>>> def a():
...    x=diction
...    x.update({365:5})
...    print('in a: ', id(x))
... 
>>> def b():
...    x=diction
...    print(x[365])
...    print('in b: ', id(x))
... 
>>> a()
in a:  4478940144
>>> b()
5
in b:  4478940144
>>> print(id(diction))
4478940144
Ответ написан
Комментировать
@Black_and_green
Developer - chigrin.xyz
У тебя в diction лежит ссылка на изменяемый (mutable) объект.
Получается в первой функции ты сохраняешь в локальную переменную x ссылку на словарь. Потом через эту ссылку изменяешь сам словарь. Во второй функции тоже самое, только читаешь.
Твое недопонимание состоит в том, что здесь не происходит копирования - т.е. в памяти всего один объект, на который есть ссылка в diction и обоих x'ах.
Если бы у тебя в diction лежало число или tuple (любой неизменяемый (immutable) объект), то такого бы не происходило.

Лучше всего посмотреть анимацию по ссылке
Ответ написан
Комментировать
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Когда ты вызываешь a(), функция меняет состояние ячейки в памяти, на которую ссылается x. Соответственно, обратно же оно не вернётся волшебным образом после окончания работы a()?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы