При каких обстоятельствах одинаковые строки имеют одинаковые ссылки?
Я искал в Интернете и переполнял вопросы, но не смог найти ответ на этот вопрос. Наблюдение, которое я сделал, состоит в том, что в 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 нового стиля.