Задали задачу про бесконечно вложенный словарь в Python. Куда копать чтобы дать ответ?

На днях разбирался с темой "Передача данных по значению и по ссылке" и мне подкинули задачу.
Дали 3 комманды.
1. a = {'k':'v'}
2. a['z'] = a
3. a['z']['k'] = 1
Выполнять их надо по-порядку.
И дали 3 вопроса:
1. С чем мы работаем в строке 2?
2. Почему память не вырастет во 2 строке?
3. Почему вырастет в 3?

На первый вопрос ответ я понял - работаем с ссылочным типом данных.
Вижу что создается рекурсия. Занятно)

Но вопрос с памятью для меня совсем не ясен.
Что мне стоит просмотреть или прочесть чтобы уловить суть и иметь возможность ответить?

Спасибо огромное!
  • Вопрос задан
  • 614 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Если формулировку задачи вам дали именно такую, то задавший её наверняка ожидал ответа, что в третьем пункте в памяти будет выделено место для числа 1, а во втором пункте в словаре будет просто сохранена ссылка на блок памяти уже выделенный в первом пункте. Но это не совсем верно. Во-первых, как уже написал Юрий, память для коллекций выделяется блоками. Во-вторых, для каждого элемента словаря создаётся структура PyDictEntry, хранящая целое число хэша и две ссылки на структуру PyObject представляющие ключ и значение элемента. Это значит, что даже сохранение ссылки на уже существующий объект израсходует 94 байта (на 64-битной платформе).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Roman_V_M
Еще можно вспомнить, что целые числа 0-255 создаются заранее и используются повторно, т. е. в 3й строке будет передана ссылка на существующий объект, представляющий число 1.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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