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.