Зачем нужен id () в Python, если уже есть hash ()

В документации 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()?

Одна из причин: «Числовые значения, которые сравнивают равные, имеют одинаковое хеш-значение (даже если они имеют разные типы, как в случае с 1 и 1.0)». Это не относится к id ().

Brad Solomon 06.04.2018 17:26

Потому что вам нужно целое число, которое гарантированно будет уникальным и постоянным для этого объекта в течение его жизни?

Aran-Fey 06.04.2018 17:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
351
2

Ответы 2

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 06.04.2018 17:30

@Nisba, да, это детализация / оптимизация реализации, правда, потому что 1 автоматически интернируется, поэтому есть только один его экземпляр.

Charles Duffy 06.04.2018 17:31

@Nisba: Это потому, что Python повторно использует один и тот же объект. Не используйте id или is для неизменяемых примитивов; это в принципе бесполезно.

user2357112 supports Monica 06.04.2018 17:31

Чтобы получить отдельные объекты str, не потребуется слишком много усилий: x = "12"; y = x[0] + x[1] было достаточно в одном тесте.

chepner 06.04.2018 17:34

@ user2357112, пожалуйста, посмотрите правку, которую я собираюсь написать

Nisba 06.04.2018 17:34

@Nisba: Если вы собираетесь изменить свой вопрос, чтобы задать больше вещей, о которых он раньше не спрашивал, не делайте этого.

user2357112 supports Monica 06.04.2018 17:34

... по этому поводу см. Что делать, когда кто-то отвечает: не будь хамелеоном, не будь вандалом - первое имеет значение немедленно.

Charles Duffy 06.04.2018 17:35

@chepner, но id("12") == id("1"+"2") верен

Nisba 06.04.2018 17:36

@ user2357112 ок. Я определил пустой класс, и два разных экземпляра имеют одинаковые идентификаторы, даже если теперь это не примитив

Nisba 06.04.2018 17:37

@Nisba, да - это то, что оптимизатор глазка может сделать в байт-коде заранее, но, как и все оптимизации, определяемые реализацией, небезопасно полагаться либо на наличие, либо на отсутствие такового.

Charles Duffy 06.04.2018 17:37

@Nisba: При жизни.

user2357112 supports Monica 06.04.2018 17:37

@Nisba Да, поэтому я специально использовал x[0] + x[1] в своем примере. CPython может оптимизировать литералы больше, чем ссылки на объекты. Кроме того, даже для более длинных строк литералы, передаваемые в id, являются анонимными, и временный объект может быть восстановлен после завершения вызова id, что позволяет повторно использовать идентификатор объекта для второго.

chepner 06.04.2018 17:37

Вы можете думать о функции id в python как о своего рода указателе, это уникальный номер для этого объекта. поэтому два идентичных объекта могут иметь один и тот же хеш, но разные идентификаторы (если хеш не основан на ссылке, и в этом случае не гарантируется возврат одного и того же хеша в разных процессах)

проверьте и этот ответ Для чего используется функция id ()?

Я думаю, что указатели и id - это очень разные концепции, за исключением CPython.

Nisba 06.04.2018 17:33

Я знаю об этом, я обновлю свой ответ, чтобы прояснить, но в некотором смысле это представление экземпляра, как и указатель.

Daniel Dubovski 06.04.2018 17:35

Другие вопросы по теме