Подтвердить что ты не робот

Есть ли уникальный идентификатор объекта в Python

Это будет похоже на метод java.lang.Object.hashcode().

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

4b9b3361

Ответ 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>])

Примечание. Вам действительно не нужно переопределять хэш, чтобы доказать это: -)