Łańcuchy w języku Python są niezmienne i obsługują interfejs bufora. Tak więc wydajne jest zwracanie nie nowych łańcuchów, ale części starego łańcucha, gdy używamy plasterków lub metody split(). Ale, o ile mi wiadomo, za każdym razem konstruuje się nowy obiekt napisów. Dlaczego tak jest? Jedynym powodem, dla którego widzę, jest to, że może trochę utrudnić zbieranie śmieci.Niezmienne łańcuchy i ich plasterki w języku Python
Prawda: w regularnych sutuacjach obciążenie pamięci jest liniowe i nie jest zauważalne: kopiowanie jest szybkie, tak jak sądzę, przydział. Ale w pytonie jest zbyt wiele rzeczy do powiedzenia, że nie jest to warte wysiłku!
EDIT:
Wydaje się, że za pomocą tego sposobu może sprawić, że zarządzanie pamięcią naprawdę bardziej komplikować. Przypadek, w którym 1/5 arbitralnego ciągu znaków jest używany tylko i nie można zwolnić całego ciągu, jest prostym przykładem. Możemy poprawić alokację pamięci, aby mógł częściowo zwolnić łańcuchy, ale prawdopodobnie byłby to głównie błąd. Wszystkie standardowe funkcje mogą być jednak emulowane za pomocą bufora lub widoku pamięci, jeśli użycie pamięci jest niezwykle ważne. Tak, kod nie będzie jeszcze tak zwięzły, ale musimy coś oddać, żeby coś dostać.
W jaki sposób zwrócisz części sznurka? Masz na myśli wskazówki? co dzieje się z ciągiem podrzędnym, jeśli oryginalny ciąg został usunięty? –
Co stanie się z buforem, jeśli oryginalny obiekt zostanie usunięty? Myślę, że kolekcja śmieci jest wystarczająco inteligentna i nie usuwa oryginalnego obiektu. – gukoff
Wierzę, że twoje pytanie jest duplikatem [Jeśli łańcuchy są niezmienne w .NET, to dlaczego Substring zabiera O (n) czas?] (Http://stackoverflow.com/questions/6742923/if-strings-are-immutable -in-net-then-why-does-substring-take-on-time). Te same argumenty są poprawne dla Pythona. – Bakuriu