Все это определяется реализацией.
В документации для интерна говорится: «Обычно имена, используемые в программах Python, автоматически интернируются, а словари, используемые для хранения атрибутов модуля, класса или экземпляра, имеют интернированные ключи."
Это означает, что все, что может быть именем и известно во время компиляции, вероятно (но не гарантировано) будет таким же, как и любые другие вхождения с тем же именем.
ДругоеСтроки не указаны для интернирования.Строки констант, появляющиеся в одном и том же модуле компиляции, складываются вместе (но это также просто детали реализации), поэтому вы получаете:
>>> a = '!'
>>> a is '!'
False
>>> a = 'a'
>>> a is 'a'
True
>>>
Строка, содержащая идентификатор, является интернированной, поэтому даже в разных компиляциях выта же строкаСтрока, которая не является идентификатором, используется совместно только в том же модуле компиляции:
>>> '!' is '!'
True