W jakich okolicznościach równe łańcuchy mają takie samo odniesienie?

Przeszukałem pytania dotyczące przepełnienia stosu i stron internetowych, ale nie udało mi się znaleźć odpowiedzi na to pytanie. Obserwacja, którą zrobiłem, jest taka, jak w Pythonie 2.7.3, jeśli przypisujesz dwie zmienne temu samemu ciągowi znaków, np.

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

Następnie zmienne będą dzielić to samo odwołanie:

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

Dotyczy to również niektórych dłuższych ciągów:

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

Istnieje jednak wiele przypadków, w których odwołanie nie jest (nieoczekiwanie) udostępniane:

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

Czy ktoś może wyjaśnić powód tego?

Podejrzewam, że interpreter i / lub jakiś mechanizm buforujący może wprowadzać uproszczenia / zastąpienia, które wykorzystują fakt, że łańcuchy Pythona są niezmienne do optymalizacji w niektórych szczególnych przypadkach, ale co ja wiem? Próbowałem tworzyć głębokie kopie łańcuchów za pomocą konstruktora str i funkcji copy.deepcopy, ale ciągi nadal niespójnie współdzielą odwołania.

Powodem, dla którego mam z tym problemy, jest to, że sprawdzam nierówności odwołań do łańcuchów w niektórych testach jednostkowych, które piszę dla metod klonowania klas python w nowym stylu.

questionAnswers(3)

yourAnswerToTheQuestion