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