Задать вопрос
@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 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 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()?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы