id() возвращает идентификатор объекта, стабильный за время его жизни. Адрес памяти — деталь CPython; в реализации с перемещающим GC идентификатор не обязан быть текущим адресом.
Опишите механику работы встроенной функции id(). Почему в CPython она возвращает адрес объекта в памяти и в каких экспериментальных реализациях Python, например PyPy, это поведение кардинально отличается из-за перемещающего сборщика мусора (Moving GC)?
id() возвращает идентификатор объекта, стабильный за время его жизни. Адрес памяти — деталь CPython; в реализации с перемещающим GC идентификатор не обязан быть текущим адресом.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
id() возвращает идентификатор объекта, стабильный за время его жизни. Адрес памяти — деталь CPython; в реализации с перемещающим GC идентификатор не обязан быть текущим адресом.
В CPython объект обычно не перемещается, поэтому адрес подходит для реализации идентичности. После уничтожения объекта адрес и id могут быть использованы повторно. PyPy — не просто эксперимент: это самостоятельная реализация, где детали зависят от GC и типа значения. Для ряда примитивов идентификатор может вычисляться из значения; перемещение объекта не должно менять наблюдаемую идентичность. Нельзя использовать id как долговечный ключ в БД или указатель для переносимого Python-кода. Сравнение значений выполняют через ==.
Источник: doc.pypy.org.