Когда вы вызываете id({})
, Python создает dict и передает его в функцию id
. Функция id
берет свой идентификатор (место в памяти) и выбрасывает dict. Дикт уничтожен. Когда вы делаете это дважды в быстрой последовательности (без создания каких-либо других диктовок за это время), диктат, создаваемый Python во второй раз, использует тот же блок памяти, что и в первый раз. (Распределитель памяти CPython делает это намного более вероятным, чем кажется.) Поскольку (в CPython) id
использует расположение памяти в качестве идентификатора объекта, идентификатор двух объектов одинаков. Этого, очевидно, не произойдет, если вы присваиваете dict переменной, а затем получаете ее id()
, потому что дикты живы в то же время , поэтому их id
должно быть другим.
Изменчивость не входит непосредственно в игру, но кодирование объектов кода кортежей и строк делает. В одном и том же объекте кода (тело функции или класса или тело модуля) будут повторно использоваться одни и те же литералы (целые числа, строки и определенные кортежи). Изменяемые объекты никогда не могут быть использованы повторно, они всегда создаются во время выполнения.
Короче говоря, идентификатор объекта уникален только для времени жизни объекта . После того, как объект уничтожен или перед его созданием, что-то еще может иметь такой же идентификатор.