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

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

9
задан EriF89 23 July 2012 в 11:35
поделиться