При каких обстоятельствах одинаковые строки имеют одинаковые ссылки?

Я искал в Интернете и переполнял вопросы, но не смог найти ответ на этот вопрос. Наблюдение, которое я сделал, состоит в том, что в Python 2.7.3, если вы назначаете двум переменным одну и ту же строку символов, например

>>> a = 'a'
>>> b = 'a'
>>> c = ' '
>>> d = ' '

Тогда переменные будут иметь одну и ту же ссылку:

>>> a is b
True
>>> c is d
True

Это также верно для некоторых более длинных строк:

>>> a = 'abc'
>>> b = 'abc'
>>> a is b
True
>>> '  ' is '  '
True
>>> ' ' * 1 is ' ' * 1
True

Однако во многих случаях ссылка (неожиданно) не передается:

>>> a = 'a c'
>>> b = 'a c'
>>> a is b
False
>>> c = '  '
>>> d = '  '
>>> c is d
False
>>> ' ' * 2 is ' ' * 2
False

Может кто-нибудь объяснить, пожалуйста, причину этого?

Я подозреваю, что может быть упрощения / замены, сделанные интерпретатором и / или некоторым механизмом кэширования, который использует тот факт, что строки Python являются неизменяемыми для оптимизации в некоторых особых случаях, но что я знаю? Я попытался сделать глубокие копии строк, используя конструктор str и функцию copy.deepcopy, но строки по-прежнему противоречиво делятся ссылками.

Причина, по которой у меня возникают проблемы, заключается в том, что я проверяю неравенство ссылок на строки в некоторых модульных тестах, которые я пишу для методов-клонов классов Python нового стиля.

Ответы на вопрос(3)

Ваш ответ на вопрос