Задать вопрос
Этот вопрос закрыт для ответов, так как повторяет вопрос В чем различие == и IS в Python?
@ilia_andryuhin
Пока что учусь

Почему is работает не так, как ожидается?

a = 'af'
b = 'a'
b += 'f'
print(a is b)
>>> False
a = 5
b = 2
b += 3
print(a is b)
>>> True

Почему и как это доказать? В интернете по этому поводу я не нашёл ответ. Ответ по типу: cмотри вот id(a), а вот id(b) не подойдут. Интересен сам алгоритм is.
Я, конечно, догадываюсь, что оно где-то на поверхности, но всё же, не даёт покоя, почему. Str не такой простой класс.

UPD. И вот ещё, что интересное.
a = 'af'
b = 'a' + 'f'

print(a is b)
>>> True


UPD2 И еще кое-что интересное.
a = 10.0
b = 7.0
b += 3.0
print(a is b)
>>> False

Значит проблема таится в int, или в обратную смотреть в str и float?
  • Вопрос задан
  • 214 просмотров
Подписаться 2 Простой 2 комментария
Решения вопроса 1
ElonMask2
@ElonMask2
Autor of Tesla Machini and SpaxeX
Ладно
a = 'af' Инициализируем ПЕРВУЮ переменную А = АФ  идентиф=1
b = 'a' Инициализируем ВТОРУЮ переменную Б= А     идентиф=2
b += 'f' Инициализируем ТРЕТЬЮ переменную Б = А + Ф  идентиф=3
# А все почему? Строка - НЕИЗМЕНЯЕМЫЙ ТИП
print(a is b)
>>> False
a = 5
b = 2
b += 3
# Тоже самое но, в питоне числа до 255 КЕШИРУЮТСЯ и 50 is 50 и 255 is 255
print(a is b)
>>> True


А тут,
a = 'af'       #Инициализируем ПЕРВУЮ (ОНА ИДЕТ В КЕШ) А = АФ
b = 'a' + 'f'  #Инициализируем ВТОРУЮ интерпретатор не тупой и Б = ТОЖЕ АФ (а так как аф есть в кеше Б получает ссылку на ту же память)

print(a is b)
>>> True


Где читать? Гугл-
Изменяемые неизменяемые типы,
Ответ написан
Ответы на вопрос 1
saboteur_kiev
@saboteur_kiev Куратор тега Python
software engineer
Потому что is это сравнение на уровне "а тот ли это самый объект".
Понятно, что эти строки - разные объекты, поэтому сравнивать нужно через ==
a = 'af'
b = 'a'
b += 'f'
print (a is b)
>>> False
print (a == b)
>>> True

Иногда питон может экономить память и если видит что переменной задается тоже самое значение изначально, он использует уже существующий объект, что может вводить тебя иногда в заблуждение.
Но операция b += 'f' не может изменить объект b, поэтому тут создается новый, другой объект.
Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы