Найти в Дзене
Павлин Шарит

Вопрос, на который должен знать ответ каждый Python разработчик

Вопрос который точно спросят на собеседовании
Оглавление
Выражение будет True или False
Выражение будет True или False

Заходя на различные форумы или телеграмм-каналы связанные с Python можно регулярно увидеть вопросы, чем отличается операторы "==" и "is". Если такие вопросы часто встречаются, значит не все знают на него ответ, поэтому давайте разберемся с ним раз и навсегда.

Если проводить аналогию с русским языком, то оператор "==" можно интерпретировать, как равно, например "a равно b", а оператор "is", как "a является b".

Практическая часть

Для начала разберем на практике примеры, где увидим, как работают операторы:

a = 5

b = 5

a == b # True

a is b # True

Пример выше можно назвать самым тривиальным и банальным, но необходим для того, чтобы перейти к более неочевидным.

a = 300
b = 300
a == b # True
a is b # False

Может показаться, что пример ничем не отличается от аналогичного выше, при этом a уже не является b. Перед тем, как разобраться почему так происходит рассмотрим еще несколько заключительных примеров и перейдем к теории.

a = []

b = []

a == b # True

a is b # False

a = 1000

b = 1000

a == b # True

a is b # False

a = b

a == b # True

a is b # True

Теоретическая часть

Оператор "==" используется для того, чтобы проверить равенство двух значений или переменных, а оператор "is" используется для проверки того, что две переменные ссылаются на одну ячейку памяти. Для того, чтобы это было проще принять необходимо рассмотреть функцию id.

id(a) # 140606811651728

Эта функция принимает объект и результатом ее выполнения будет число, которое указывает на идентификатор объекта. Данный идентификатор является уникальным для каждого объекта и не меняется на протяжении его жизни. Можно сказать, что оператор "is" как раз и проверяет идентификаторы объекта.

Рассмотрим пример с числами и почему в первом случае мы получали "True", а во втором "False". Дело в том, что Python хранит идентификаторы чисел от -5 до 256. Когда присваивается значение в этом диапазоне переменной в нее записывается ссылка на этот идентификатор и поэтому при проверке идентификаторов переменные равны.

Но если значения выходят за этот диапазон, то для каждой переменной python создает новый объект и присваивает каждой из них ссылку на новый объект.

Когда мы используем оператор присваивания, мы присваиваем переменной ссылку на значение второй переменной, поэтому в заключительном примере мы получаем "True"

Чтобы не пропустить последующие статьи - не забывайте подписаться, а чтобы порадовать меня - поставить лайк.