Рубрики
Без рубрики

Разница между в Python

Операторы выполняют очень похожие задачи в Python, но они очень отличаются друг от друга и имеют дело с очень интересной концепцией: как

Автор оригинала: 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 каждый объект имеет четыре части в памяти:

  1. Размер – Для каждого объекта 4 байта зарезервированы, которые удерживают размер объекта.
  2. Ссылочный счетчик – Для каждого объекта 8 байтов зарезервированы, которые удерживают количество переменных, которые указывают на этот объект. И все эти объекты будут иметь идентификатор объекта этого объекта.
  3. Тип объекта – Для каждого объекта 8 байтов зарезервированы, которые удерживают информацию, которая говорит, какой тип объекта есть.
  4. Объектное значение – Еще 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' также кэшируются аналогично), а две переменные, имеющие То же значение в этом диапазоне указывается на тот же объект.