Тестирование на равенство ссылок в Python - PullRequest
26 голосов
/ 01 сентября 2011

Скажем, у меня есть класс в Python, в котором определен метод eq для сравнения атрибутов на равенство:

class Foo(object):
    # init code...

    def __eq__(self, other):
        # usual eq code here....

Как я могу тогда сравнить два экземпляра Foo на равенство ссылок (то есть проверить, являются ли онитот же экземпляр)?Если я это сделаю:

f1 = Foo()
f2 = Foo()
print f1 == f2

Я получу Истину, даже если это разные объекты.

Ответы [ 3 ]

47 голосов
/ 01 сентября 2011

То is оператор

print f1 is f2
3 голосов
/ 01 сентября 2011

f1 is f2 проверяет, относятся ли две ссылки к одному и тому же объекту.Под капотом это сравнивает результаты id(f1) == id(f2), используя встроенную функцию id, которая возвращает целое число, которое гарантированно уникально для объекта (но только в течение времени жизни объекта).

В CPython это целое число является адресом объекта в памяти, хотя в документах упоминается, что вы должны делать вид, что не знаете этого (поскольку в другой реализации могут быть другие методы генерации идентификатора).

2 голосов
/ 01 сентября 2011

Используйте ключевое слово is.

print f1 is f2

Некоторые интересные вещи (которые, как я полагаю, зависят от реализации, но они верны в CPython) с ключевым словом is, заключаются в том, что None, True и False являются единичными экземплярами. Так что True is True вернет True.

Строки также интернированы в CPython, поэтому 'hello world' is 'hello world' вернет True (вы не должны полагаться на это в обычном коде).

...