Есть ли в Python уникальный идентификатор объекта - PullRequest
62 голосов
/ 10 августа 2009

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

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

Ответы [ 4 ]

97 голосов
/ 10 августа 2009
id(x)

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

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

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

29 голосов
/ 10 августа 2009

Вот для чего "is".

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

test "if a is b", который будет проверять тот же идентификатор.

2 голосов
/ 10 августа 2009

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

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

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

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

0 голосов
/ 14 января 2015

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...