Автор оригинала: 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' также кэшируются аналогично), а две переменные, имеющие То же значение в этом диапазоне указывается на тот же объект.