LINUX.ORG.RU

А как проверить экземпляры объектов на абсолютную идентичность?

 


0

1

Есть три списка и подозрение, что в них хранятся одни и те же объекты. Как это проверить? Они все экземпляры одного класса. По полям проверять не вариант - они могут бытьи не заполнены.

Deleted

cmp() по спискам.

x0r ★★★★★
()

Одинаковые, в смысле это один и тот же объект? Тогда можно сравнить по id(x)==id(y)

Deleted
()
Ответ на: комментарий от Deleted

У всех объектов есть свой id. По сути это адрес в памяти.

Deleted
()

По полям проверять не вариант - они могут бытьи не заполнены.

Что значит не заполнены? Там None? Ну тогда None тоже можно проверять.

Если тебе нужно убедиться что там «абсолютно идентичные» объекты то используй is. Однако, может быть такое что объекты разные, но предоставляют одни и те же данные:

In [1]: x=1000

In [2]: y=1000

In [3]: x is y
Out[3]: False

Поэтому я бы использовал == для сравнения. Более подробно про это можно прочитать в описании метода __cmp__

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Поэтому я бы использовал == для сравнения. Более подробно про это можно прочитать в описании метода __cmp__

Ок, спасибо, почитаю. Но мне и варианта moon хватило :)

Deleted
()
Ответ на: комментарий от tailgunner

Почему в данном случае ты рекомендуешь is? В общем случае он же найдёт меньше совпадений.

PS лично я зарёкся этим is пользоваться.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Почему в данном случае ты рекомендуешь is?

В каком «данном» - для целых чисел? Не рекомендую. Но is - это единственный способ установить, что два имени ссылаются на один объект, что и нужно ТС.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Одно радует, что питон простенький и немногословный

Да, этого у него не отнимешь.

Deleted
()
Ответ на: комментарий от ei-grad

Я тоже думал привести этот пример и проверил его на небольших числах — к удивлению обнаружил False (проверял в ipython). Но, помня, что первые n чисел типа кэшируются я выбрал числа побольше.

Сейчас у меня этот глюк не воспроизводится. Я поэтому пока склонен считать что я что-то попутал.

true_admin ★★★★★
()
Ответ на: комментарий от aedeph_

Кому надо — тот посмотрит, главное что задал направление и привёл корректный пример демонстрирующий проблемы. Заучиванием манов наизусть тоже не страдаю. Я на форуме отдыхаю, мне не всегда интересно копать слишком глубоко или искать справочную информацию. Я даже, о ужас, бываю не прав или невнимательно читаю топик.

Это помимо того что речь шла не о конкретном диапазоне чисел которые закэшированы (к слову, я знаю где и как это сделано), а о том что по каким-то причинам это _не_сработало_. Вот в этом направлении тебе надо было гуглить (а не тыкать в стандартный ман), тогда наткнулся бы, например, на http://stackoverflow.com/questions/15171695/weird-integer-cache-inside-python... . Но у меня было открыто окошко с третьим питоном, а не вторым. Можешь поломать голову как у меня получилось воспроизвести проблему. мне это не интересно т.к. кода который зависит от поведения оператора is я не пишу.

Но это всё фигня. Ты мне лучше скажи зачем ты ко мне прицепился? У тебя какой-то пунктик или мои посты задевают твою самооценку?

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Это не стандартный ман, это _детали реализации_ cpython. Ты даже этого не понимаешь?

зачем ты ко мне прицепился

Я хотел уже зажечь третью звезду, а какие-то тупорылые вахтёры мне по надуманным причинам вторую гасят. По-этому когда я вижу от них тупняк, я считаю необходимым показать это всем.

aedeph_ ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.