Подтвердить что ты не робот

Тестирование для ссылочного равенства в Python

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

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

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

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

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

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

4b9b3361

Ответ 1

Это оператор is

print f1 is f2

Ответ 2

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

print f1 is f2

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

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

Ответ 3

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

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