Функция Uniq ID в Python или нет?

1

У меня есть несколько скриптов python, которые выполняют параллельный этот простой код:

test_id = id('test')

Является ли test_id уникальным или нет?

  • 2
    Нам нужно знать, что вы на самом деле планируете делать с test_id , чтобы ответить на вопрос. И под уникальным вы подразумеваете уникальный для входных данных, которые сравниваются с == , или же такие объекты, созданные в разное время, имеют разные test_id ? А как насчет вызовов или процессов?
Теги:

4 ответа

2
Лучший ответ

http://docs.python.org/library/functions.html#id

Верните "идентификатор" объекта. Это целое число (или длинное целое число), которое гарантировано будет уникальным и постоянным для этого объекта в течение его жизни. Два объекта с неперекрывающимся временем жизни могут иметь одинаковое значение id().
Подробности реализации CPython: это адрес объекта.

Так что да, идентификаторы уникальны.

Однако, поскольку строки Python неизменяемы, id('test') может быть одинаковым для всех строк, поскольку 'test' is 'test', вероятно, будет True.

  • 0
    Если OP запускает несколько экземпляров Python параллельно, то это не обязательно будет уникальным.
  • 0
    Правильно, но при использовании потоков я думаю, что это так.
1

Что вы имеете в виду уникальным? Уникальный среди чего?

Это просто идентификатор части памяти, используемый значением параметра. Для неизменяемых объектов с одинаковым значением часто бывает одно и то же:

>>> id('foo') == id('fo' + 'o')
True
0

Это могло бы помочь, если бы вы говорили о том, что вы пытались сделать - на самом деле не типично использовать встроенный id() для чего угодно, и меньше всего строк, если вы действительно не знаете, что делаете.

Документы Python прекрасно описывают встроенную функцию id():

Это целое число (или длинное целое число), которое гарантировано будет уникальным и постоянным для этого объекта в течение его жизни. Два объекта с неперекрывающимся временем жизни могут иметь одинаковое значение id().

Когда я прочитал это, возвращаемые значения id() действительно гарантированы только уникальными в одном экземпляре интерпретатора - и даже тогда, только если время жизни элементов перекрывается. Сохранение этих идентификаторов для последующего использования, отправка их через сокеты и т.д. Кажется нецелесообразным. Опять же, я не думаю, что это действительно для людей, которые не знают, что им это нужно.

Если вы хотите генерировать идентификаторы, которые являются уникальными для нескольких экземпляров программы, вы можете проверить модуль uuid.

Мне также приходит в голову, что вы можете создавать хэши из объектов Python.

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

0

В CPython id является указателем на объект в памяти.

>>> a = [1,2,3]
>>> b = a
>>> id(a) == id(b)
True

Таким образом, если у вас есть несколько ссылок на один и тот же объект (а в некоторых случаях, маленькие строки создаются только один раз, а также числа меньше 257), он не будет уникальным

Ещё вопросы

Сообщество Overcoder
Наверх
Меню