Есть ли уникальный идентификатор объекта в Python
Это было бы похоже на Java.ленг.Объект.метод hashCode ().
Мне нужно хранить объекты, которые я не контролирую в наборе, и убедитесь, что только если два объекта на самом деле являются одним и тем же объектом (не содержат одинаковых значений), значения будут перезаписаны.
4 ответов:
id(x)будет делать трюк для вас. Но мне любопытно, что не так с набором объектов (который объединяет объекты по значению)?
для вашей конкретной проблемы, я бы, наверное, держать набор идентификаторов, или объектов фантик. Объект-оболочка будет содержать одну ссылку и сравнивать по
x==yx.ref is y.ref.также стоит отметить, что объекты Python имеют
hashфункции также. Эта функция необходима для помещения объекта в набор или словарь. Оно предполагается, что иногда сталкиваются для разных объектов, хотя хорошие реализацииhashпопробуйте сделать это менее вероятно.
как упоминает Илья 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