Автор оригинала: Pankaj Kumar.
Операторы ==
и это
Оба выполняют очень похожие задачи в Python, но они сильно отличаются друг от друга и имеют дело с очень интересной концепцией: как Python хранит свои переменные в памяти.
Понимание разницы между
Простые термины,
==
Проверяет значение двух операндов, и если они одинаковы, он возвращаетПравда
, в противном случае он возвращаетЛожь
Отказэто
Проверяет идентификатор объекта двух операндов и возвращаетПравда
Если они одинаковы.
Но что такое объект? Каждый объект выделяется идентификатор в памяти, и две переменные могут указывать на тот же объект, который дает им тот же идентификатор объекта.
Давайте использовать списки, чтобы увидеть их разницу:
lst1 = [1,2,3] lst2 = [1,2,3] print(lst1 == lst2) print(lst1 is lst2) lst2 = lst1 print() print(lst1 is lst2)
Выход:
True False True
В приведенном выше случае, изначально, в памяти есть два списка, но они удерживают точные же значения.
==
сравнивает значения, так что операция возвращаетПравда
Отказ- Но
это
Проверяет, если они указывают на тот же объект, и эти списки на самом деле являются разными объектами, поэтому возвращаетЛожь
Отказ - После этого мы делаем
lst2
равноlst1
это делаетlst2
указать на то, гдеlst1
указывает, поэтому тогдаэто
ВозвращаетПравда
Отказ
Все это очень отличается для целых чисел, и понимать, что нам нужно знать, как объекты хранятся в памяти.
Распределение памяти в Python
Нам нужно понять распределение памяти объектов в Python, чтобы идти дальше в этом руководстве.
Давайте возьмем пример:
number = 10
Здесь мы знаем, что Номер
Удерживает значение 10, но как он хранится в памяти? В Python каждый объект имеет четыре части в памяти:
- Размер – Для каждого объекта 4 байта зарезервированы, которые удерживают размер объекта.
- Ссылочный счетчик – Для каждого объекта 8 байтов зарезервированы, которые удерживают количество переменных, которые указывают на этот объект. И все эти объекты будут иметь идентификатор объекта этого объекта.
- Тип объекта – Для каждого объекта 8 байтов зарезервированы, которые удерживают информацию, которая говорит, какой тип объекта есть.
- Объектное значение – Еще 8 байтов зарезервированы для каждого объекта, и они имеют фактическое значение объекта.
Теперь в вышеупомянутом списке объект стоимость и счетчик ссылок являются теми, которые важны для этого обсуждения.
Итак, для Номер
, существует объект в памяти, который имеет значение 10 объекта, и ссылочное значение 1, что означает, что объект имеет значение 10, а одна переменная указывает на него, что в нашем случае это Номер
Отказ
Теперь скажем, мы объявляем другую переменную, как это:
number_2 = number print(number == number_2) print(number is number_2)
Теперь в памяти будет очень интересная вещь, не будет создана новых объектов, а Number_2
также укажет, где Номер
Указывает, а ссылочный счетчик объекта увеличится до 2.
Следовательно, Номер
и Number_2
будет иметь тот же идентификатор объекта, а выход будет:
True True
Но что, если мы сделаем это?
num1 = 10 num2 = 10 print(num1 == num2) print(num1 is num2)
В приведенном выше примере выход будет:
True True
Специальные номера от -5 до 256
Python рассматривает целые числа от -5 до 256 широко используемых целых чисел, и поэтому объекты для этих целых чисел всегда предопределены, и вы не можете удалить эти объекты из памяти.
Таким образом, в начале кода Python все эти объекты имеют ссылочный счетчик нуля, но если любые переменные выполнены для удержания значений между -5 и 256 (включительно), то новые объекты не будут созданы, и все переменные будут просто указать на уже существующие.
Таким образом, в вышеуказанном коде объект на 10 уже находится в памяти, первые две строки просто создают переменные, которые указывают на тот же объект.
Итак, для следующего кода:
num1 = 257 num2 = 257 print(num1 == num2) print(num1 is num2)
Выход будет:
True False
Это потому, что Python создает новые экземпляры для целых чисел за пределами этого диапазона каждый раз, когда они объявлены. Обратите внимание, что если бы мы сделали Num2
Тогда независимо от стоимости Num1
оба из них указывают на одного и того же объекта.
Заключение
В этом руководстве мы видели разницу между ==
и это
и как это
Может быть полезен в нахождении, если две переменные указывают на то же местоположение памяти.
Мы также увидели, как целые числа от -5 до 256 кэшируются в памяти, потому что они считаются широко используемыми (символами, такие как 'A'
и 'B'
также кэшируются аналогично), а две переменные, имеющие То же значение в этом диапазоне указывается на тот же объект.