Есть ли уникальный идентификатор объекта в Python
Это будет похоже на метод java.lang.Object.hashcode()
.
Мне нужно хранить объекты, над которыми у меня нет контроля, и убедиться, что только если два объекта фактически являются одним и тем же объектом (не содержат одинаковые значения), значения будут перезаписаны.
Ответы
Ответ 1
id(x)
сделает трюк для вас. Но мне любопытно, что неправильно в отношении набора объектов (который объединяет объекты по значению)?
Для вашей конкретной проблемы я бы, вероятно, сохранил набор идентификаторов или объектов-оболочек. Объект-обертка будет содержать одну ссылку и сравнивать с помощью x==y
< == > x.ref is y.ref
.
Также стоит отметить, что объекты Python также имеют функцию hash
. Эта функция необходима для помещения объекта в набор или словарь. Предполагается, что он иногда сталкивается для разных объектов, хотя хорошие реализации hash
пытаются сделать его менее вероятным.
Ответ 2
То, что "is
" для.
Вместо тестирования "if a == b
", который проверяет одно и то же значение,
test "if a is b
", который будет проверять один и тот же идентификатор.
Ответ 3
Как упоминает ilya n, id (x) создает уникальный идентификатор для объекта.
Но ваш вопрос запутан, так как метод hashCode Java не дает уникальный идентификатор. Java hashCode работает как большинство хеш-функций: он всегда возвращает одно и то же значение для одного и того же объекта, два одинаковых объекта всегда получают одинаковые коды, а неравные хэш-значения подразумевают неравные хэш-коды. В частности, два разных и неравных объекта могут получать одно и то же значение.
Это запутанно, потому что криптографические хеш-функции сильно отличаются от этого и более похожи (хотя и не совсем) на "уникальный идентификатор", который вы просили.
Python эквивалент метода hashCode Java - hash (x).
Ответ 4
Вам не нужно сравнивать объекты перед их размещением в наборе. set() уже позаботится об этом.
class A(object):
a = 10
b = 20
def __hash__(self):
return hash((self.a, self.b))
a1 = A()
a2 = A()
a3 = A()
a4 = a1
s = set([a1,a2,a3,a4])
s
=> set([<__main__.A object at 0x222a8c>, <__main__.A object at 0x220684>, <__main__.A object at 0x22045c>])
Примечание. Вам действительно не нужно переопределять хэш, чтобы доказать это: -)