Чем is отличается от ==

Чем is отличается от == в Python

Оператор « == » возвращает True, если сравниваемые объекты имеют одинаковые значения.
Оператор is возвращает True, если сравниваемые объекты, помимо того, что имеют одинаковые значения, еще и ссылаются на одну и ту же область памяти. Таким образом, is отличается от == в Python дополнительной проверкой на идентичность адресов в памяти, на которые ссылаются переменные.

Протестируем работу операторов сравнения!

Для начала создадим 2 разных объекта с одинаковыми значениями. При этом ссылаться созданные объекты будут на разные ячейки памяти. Кстати, узнавать адрес в памяти, по которому хранятся объекты, мы будем с помощью функции id():

  a = 1000
  b = 700 + 300

  # узнаем адреса в памяти, на которые
  # указывают переменные a и b:
  print(id(a), id(b))

  print('\nРезультат сравнения a и b с помощью оператора "==": ')
  print(a == b)

  print('\nРезультат сравнения a и b с помощью оператора "is": ')
  print(a is b)

Вывод на экран:

140583993536752 140583993536816
 
Результат сравнения a и b с помощью оператора "==": 
True 

Результат сравнения a и b с помощью оператора "is":  
False 

Как видно из приведенного выше примера, переменные a и b ссылаются на разные области в памяти, хотя и имеют одинаковые значения: a = 1000 и b = 1000. Так как при сравнении переменных посредством оператора «==» сравниваются только значения переменных, то результатом сравнения a == b является True. При этом результат сравнения переменных посредством оператора «is«: a is b оказался равен False, так как эти переменные ссылаются на разные области в памяти:

id(a) = 140583993536560
id(b) = 140583993536592 

Какой оператор выбрать для сравнения: == или is?

Таким образом, подытожим все выше сказанное: для сравнения значений переменных используйте оператор «==». В тех случаях, когда важно, чтобы переменные указывали на одну и ту же область в памяти, используйте оператор «is». На этом можно было бы считать статью завершенной, если бы не маленькое НО, которое можно считать изюминкой (или сморщенной виноградинкой 😉 ) Python:

Кеширование малых чисел в Python!

Python кеширует в памяти все числа от -5 до 256. Это значит, что для каждого числа из указанного диапазона в Python отводится отдельная область в памяти. И любая переменная со значением из указанного диапазона будет ссылаться на эту заранее выделенную область в памяти. Поэтому, если у сравниваемых переменных одинаковые значения, которые попадают в диапазон от -5 до 256, то эти переменные ссылаются на один и тот же адрес в памяти, и, соответственно, результат сравнения x is y будет равен True:

''' Значение 5 попадает в диапазон [-5, 256], 
поэтому Python его закешировал =>  a и b 
ссылаются на одну и ту же область в памяти:'''

a = 5
b = 2 + 3

print(a is b)
print(id(a), id(b))
 Вывод на экран: 
 True
 94247940637760 94247940637760
''' Значение 500 не попадает в диапазон [-5, 256], 
поэтому Python его не кеширует =>  a и b 
ссылаются разные области в памяти:'''

a = 500
b = 200 + 300

print(a is b)
print(id(a), id(b))
Вывод на экран: 
False 
140583993537200 140583993537360

Таким образом, если значения сравниваемых переменных попадают в диапазон от -5 до 256, то результаты сравнения операторами «==» и «is» будут одинаковы.

Добавить комментарий