← Все вопросы

Почему is и == путают даже опытных?

Задан 2 месяца назад6 просмотров1 ответ
0

Когда использовать is, а когда == — уже знаю. Но вот нюанс...

a = "hello" b = "hello" print(a is b) # True

c = "hello world!" d = "hello world!" print(c is d) # False Я в курсе про интернирование строк. Но как узнать наверняка, проинтернирована ли строка в данный момент? И можно ли как-то принудительно заставить интернировать любую строку?

1 ответ

0

короче интернирование — это оптимизация cpython, а не гарантия языка. поэтому «наверняка» узнать нельзя и полагаться на это в коде не стоит. питон сам решает: короткие строки-литералы, похожие на идентификаторы (буквы/цифры/подчёркивание), обычно интернируются ещё на этапе компиляции — вот "hello" и даёт True. а "hello world!" с пробелом и ! уже нет, отсюда False.

если реально надо — форсить можно через sys.intern:

import sys
c = sys.intern("hello world!")
d = sys.intern("hello world!")
print(c is d)  # True

это иногда делают ради скорости, когда много одинаковых строк сравнивают — is по интернированным быстрее, чем посимвольно. но для обычной логики всегда == для строк, а is оставляй для None/True/False. правило простое: если тебе вообще важно, интернирована ли строка, — значит is стоит там, где нужен ==)

Ваш ответ

, чтобы ответить на вопрос.