В документации Python для функции id() говорится:
id(object) Return the “identity” of an object. This is an integer which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value.
Таким образом, практически он гарантирует уникальность как хеш-функцию, но только в пределах продолжительности жизни объекта и без того крутого момента, что хеш-код трудно реконструировать.
Зачем использовать id()?
Потому что вам нужно целое число, которое гарантированно будет уникальным и постоянным для этого объекта в течение его жизни?






hash одинаков для объектов равный и может быть одинаковым даже для неравных объектов. hash не существует даже для изменяемых объектов.
id гарантированно уникален для объекта в течение его жизни, и он не заботится о мутации.
Варианты использования совершенно разные.
>>> x, y, z = 1, 1.0, [1]
>>> hash(x), hash(y)
(1, 1)
>>> hash(z)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> id(x), id(y)
(10832608, 139668416746072)
>>> id(z)
139668282136008
>>> z.append(2)
>>> id(z)
139668282136008
>>> hash(-1), hash(-2)
(-2, -2)
все равно id(str(1)) == id(str(1)) это правда!
@Nisba, да, это детализация / оптимизация реализации, правда, потому что 1 автоматически интернируется, поэтому есть только один его экземпляр.
@Nisba: Это потому, что Python повторно использует один и тот же объект. Не используйте id или is для неизменяемых примитивов; это в принципе бесполезно.
Чтобы получить отдельные объекты str, не потребуется слишком много усилий: x = "12"; y = x[0] + x[1] было достаточно в одном тесте.
@ user2357112, пожалуйста, посмотрите правку, которую я собираюсь написать
@Nisba: Если вы собираетесь изменить свой вопрос, чтобы задать больше вещей, о которых он раньше не спрашивал, не делайте этого.
... по этому поводу см. Что делать, когда кто-то отвечает: не будь хамелеоном, не будь вандалом - первое имеет значение немедленно.
@chepner, но id("12") == id("1"+"2") верен
@ user2357112 ок. Я определил пустой класс, и два разных экземпляра имеют одинаковые идентификаторы, даже если теперь это не примитив
@Nisba, да - это то, что оптимизатор глазка может сделать в байт-коде заранее, но, как и все оптимизации, определяемые реализацией, небезопасно полагаться либо на наличие, либо на отсутствие такового.
@Nisba Да, поэтому я специально использовал x[0] + x[1] в своем примере. CPython может оптимизировать литералы больше, чем ссылки на объекты. Кроме того, даже для более длинных строк литералы, передаваемые в id, являются анонимными, и временный объект может быть восстановлен после завершения вызова id, что позволяет повторно использовать идентификатор объекта для второго.
Вы можете думать о функции id в python как о своего рода указателе, это уникальный номер для этого объекта. поэтому два идентичных объекта могут иметь один и тот же хеш, но разные идентификаторы (если хеш не основан на ссылке, и в этом случае не гарантируется возврат одного и того же хеша в разных процессах)
проверьте и этот ответ Для чего используется функция id ()?
Я думаю, что указатели и id - это очень разные концепции, за исключением CPython.
Я знаю об этом, я обновлю свой ответ, чтобы прояснить, но в некотором смысле это представление экземпляра, как и указатель.
Одна из причин: «Числовые значения, которые сравнивают равные, имеют одинаковое хеш-значение (даже если они имеют разные типы, как в случае с 1 и 1.0)». Это не относится к id ().