Если вы прочитали документацию для id
, в ней говорится:
Вернуть «идентификатор» объекта. Это целое число, которое гарантировано будет уникальным и постоянным для этого объекта в течение его жизни. Два объекта с неперекрывающимися временами жизни могут иметь одинаковое значение
blockquote>id()
.И это именно то, что происходит: у вас есть два объекта с неперекрывающимися сроками службы, потому что первый из них уже вышел
Но не верьте, что это будет всегда . Особенно, если вам нужно иметь дело с другими реализациями Python или с более сложными классами. Все, что говорит язык, состоит в том, что эти два объекта могут иметь одинаковое значение
id()
, а не то, что они будут . И тот факт, что они делают , зависит от двух деталей реализации:
- Сборщик мусора должен очистить первый объект, прежде чем ваш код даже начнет выделять второй объект- который, как гарантируется, произойдет с CPython или любой другой реализацией пересчета (когда нет круговых ссылок), но довольно маловероятен с коллективным сборщиком мусора, как в Jython или IronPython.
- Распределитель под крышками имеет чтобы иметь очень сильное предпочтение повторного использования недавно освобожденных объектов того же типа. Это справедливо в CPython, который имеет несколько уровней фантастических распределителей поверх базового C
malloc
, но большинство других реализаций намного больше уходят в основную виртуальную машину.Последнее: факт, что
object.__repr__
имеет подстроку, которая оказывается такой же, какid
как шестнадцатеричное число, является всего лишь артефактом реализации CPython, который нигде не гарантируется. Согласно docs :Если это вообще возможно, это должно выглядеть как действительное выражение Python, которое может быть использовано для воссоздания объекта с тем же значением (с учетом соответствующая среда). Если это невозможно, должна быть возвращена строка формы
blockquote><...some useful description…>
.Тот факт, что CPython
object
, кажется, помещаетhex(id(self))
(фактически, я считаю, что он делает эквивалентsprintf
, указав его указатель на%p
, но поскольку CPythonid
просто возвращает тот же самый указатель, который был добавлен кlong
, который заканчивается тем же самым) нигде не гарантируется. Даже если это было верно, так как ... доobject
даже существовало в начале 2.x дней. Вы можете полагаться на него для такого простого простого «что здесь происходит» отладки в интерактивном приглашении, но не пытайтесь использовать его за его пределами.