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



Это было бы похоже на Java.ленг.Объект.метод hashCode ().



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

362   4  

4 ответов:

id(x)

будет делать трюк для вас. Но мне любопытно, что не так с набором объектов (который объединяет объекты по значению)?

для вашей конкретной проблемы, я бы, наверное, держать набор идентификаторов, или объектов фантик. Объект-оболочка будет содержать одну ссылку и сравнивать по x==y x.ref is y.ref.

также стоит отметить, что объекты Python имеют hash функции также. Эта функция необходима для помещения объекта в набор или словарь. Оно предполагается, что иногда сталкиваются для разных объектов, хотя хорошие реализации hash попробуйте сделать это менее вероятно.

вот что значит "is" для.

вместо тестирования "if a == b", который проверяет одно и то же значение,

как упоминает Илья n, id (x) создает уникальный идентификатор для объекта.

но ваш вопрос сбивает с толку, так как метод хэш-кода Java не дает уникального идентификатора. Хэш-код Java работает как большинство хэш-функций: он всегда возвращает одно и то же значение для одного и того же объекта, два равных объекта всегда получают одинаковые коды, а неравные хэш-значения подразумевают неравные хэш-коды. В частности, два разных и неравных объекта могут получить одинаковое значение.

Это сбивает с толку, потому что криптографические хэш-функции сильно отличаются от этого и больше похожи (хотя и не совсем) на "уникальный идентификатор", который вы просили.

эквивалент Python метода хэш-кода Java-это hash (x).

вам не нужно сравнивать объекты перед их размещением в наборе. семантика 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>])

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

Comments

    Ничего не найдено.