У меня есть несколько скриптов python, которые выполняют параллельный этот простой код:
test_id = id('test')
Является ли test_id
уникальным или нет?
http://docs.python.org/library/functions.html#id
Верните "идентификатор" объекта. Это целое число (или длинное целое число), которое гарантировано будет уникальным и постоянным для этого объекта в течение его жизни. Два объекта с неперекрывающимся временем жизни могут иметь одинаковое значение id().
Подробности реализации CPython: это адрес объекта.
Так что да, идентификаторы уникальны.
Однако, поскольку строки Python неизменяемы, id('test')
может быть одинаковым для всех строк, поскольку 'test' is 'test'
, вероятно, будет True
.
Что вы имеете в виду уникальным? Уникальный среди чего?
Это просто идентификатор части памяти, используемый значением параметра. Для неизменяемых объектов с одинаковым значением часто бывает одно и то же:
>>> id('foo') == id('fo' + 'o')
True
Это могло бы помочь, если бы вы говорили о том, что вы пытались сделать - на самом деле не типично использовать встроенный id() для чего угодно, и меньше всего строк, если вы действительно не знаете, что делаете.
Документы Python прекрасно описывают встроенную функцию id():
Это целое число (или длинное целое число), которое гарантировано будет уникальным и постоянным для этого объекта в течение его жизни. Два объекта с неперекрывающимся временем жизни могут иметь одинаковое значение id().
Когда я прочитал это, возвращаемые значения id() действительно гарантированы только уникальными в одном экземпляре интерпретатора - и даже тогда, только если время жизни элементов перекрывается. Сохранение этих идентификаторов для последующего использования, отправка их через сокеты и т.д. Кажется нецелесообразным. Опять же, я не думаю, что это действительно для людей, которые не знают, что им это нужно.
Если вы хотите генерировать идентификаторы, которые являются уникальными для нескольких экземпляров программы, вы можете проверить модуль uuid.
Мне также приходит в голову, что вы можете создавать хэши из объектов Python.
Вероятно, есть некоторый подход к вашей проблеме, который будет более чистым, чем попытка использовать функцию id(), возможно, проблема нуждается в переформулировке.
В CPython id
является указателем на объект в памяти.
>>> a = [1,2,3]
>>> b = a
>>> id(a) == id(b)
True
Таким образом, если у вас есть несколько ссылок на один и тот же объект (а в некоторых случаях, маленькие строки создаются только один раз, а также числа меньше 257), он не будет уникальным
test_id
, чтобы ответить на вопрос. И под уникальным вы подразумеваете уникальный для входных данных, которые сравниваются с==
, или же такие объекты, созданные в разное время, имеют разныеtest_id
? А как насчет вызовов или процессов?