>>> s1 = 'foo!'
>>> s2 = 'foo!'
>>> s1 is s2
False
про id для строковых.
там есть поведение
строковые состоящие из подряд идущих "безопасных для идентификаторов символов" alphanumeric и подчерка(могу ошибаться) интепретатор делает так, что от такой строки вычисляется одинаковый id.
афаик это связано с тем что такие строковоые - суть имена идентификаторов.
и соответсвенно если строки содержат пробелы и другие спец.символы, недопустимые для идентификаторов.
но в общем Славик сказал правильно, id для строковых это undefined behavior, не стоит на него полагаться.