Ответ 1
Это оператор is
print f1 is f2
Скажем, у меня есть класс в Python, который имеет метод eq, определенный для сравнения атрибутов для равенства:
class Foo(object):
# init code...
def __eq__(self, other):
# usual eq code here....
Как я могу сравнить два экземпляра Foo для ссылочного равенства (это тест, если они являются одним и тем же экземпляром)? Если я это сделаю:
f1 = Foo()
f2 = Foo()
print f1 == f2
Я получаю True, даже если это разные объекты.
Это оператор is
print f1 is f2
Используйте ключевое слово is
.
print f1 is f2
Некоторые интересные вещи (которые зависят от реализации, я верю, но они верны в CPython) с ключевым словом is
заключается в том, что None, True и False являются единственными экземплярами. Поэтому True is True
вернет True.
Строки также интернированы в CPython, поэтому 'hello world' is 'hello world'
вернет True (вы не должны полагаться на это в обычном коде).
f1 is f2
проверяет, соответствуют ли две ссылки одному и тому же объекту. Под капотом это сравнивает результаты id(f1) == id(f2)
с помощью встроенной функции id
, которая возвращает целое число, гарантированное уникальное для объекта (но только в течение жизни объекта).
В CPython это целое число является адресом объекта в памяти, хотя в документах упоминается, что вы должны притворяться, что не знаете, что (поскольку другая реализация может иметь другие методы генерации id).