Другие ответы здесь верны: is
используется для идентичности сравнения, а ==
используется для равенства сравнения. Поскольку вас волнует равенство (две строки должны содержать одинаковые символы), в этом случае оператор is
просто неверен, и вы должны использовать вместо него ==
.
Причина, по которой is
работает в интерактивном режиме, заключается в том, что (большинство) строковых литералов по умолчанию интернированы . Из Википедии:
Стажированные строки ускоряют строку
сравнения, которые иногда
узкое место производительности в приложениях
(такие как компиляторы и динамические
время выполнения языка программирования), что
полагаться на хэш-таблицы с
строковые ключи. Без стажировки,
проверяя, что две разные строки
равны включает в себя изучение каждого
характер обеих строк. Это
медленно по нескольким причинам: это
по сути O (n) в длине
строки; обычно требуется чтение
из нескольких областей памяти, которые
занимать время; и читает заполняет
кеш процессора, значит там меньше
кеш доступен для других нужд. С
интернированные строки, простой объект
Тест идентичности достаточно после
оригинальная интерновская операция; это
обычно реализуется как указатель
тест на равенство, как правило, только один
машинная инструкция без памяти
ссылка вообще.
Таким образом, когда в вашей программе есть два строковых литерала (слова, которые буквально набираются в исходный код вашей программы, заключены в кавычки), которые имеют одинаковое значение, компилятор Python автоматически объединяет строки, делая их оба сохраненными. в том же месте памяти. (Обратите внимание, что это не всегда происходит, и правила, когда это происходит, довольно запутанны, поэтому, пожалуйста, не полагайтесь на это поведение в рабочем коде!)
Поскольку в вашем интерактивном сеансе обе строки фактически хранятся в одной и той же ячейке памяти, они имеют одинаковую идентичность , поэтому оператор is
работает, как и ожидалось. Но если вы строите строку другим методом (даже если эта строка содержит точно тех же символов), тогда строка может быть равна , но это не то же самое строка - то есть она имеет другую идентичность , потому что она хранится в другом месте в памяти.