Операции на месте возможны только для изменяемых объектов, таких как list
. В Python, как и в Java, строки являются неизменным типом. Операция line.lower()
создает совершенно новый и отдельный строковый объект. Без части something = ...
вы потеряете ссылку на этот новый объект, и line
с радостью будет продолжать привязываться к исходной строке в верхнем регистре. Если вы переназначаете конкретно значение line
, а не какое-либо другое имя, вы будете привязывать это имя к новому объекту в нижнем регистре. В CPython это означает, что вы уменьшите счетчик ссылок исходной строки и, возможно, соберите мусор.
При этом ничто не мешает вам написать класс, который ведет себя так, как вы хотите. Это можно сделать изменяемым, поддерживая внутреннюю ссылку на строку. Реализуя правильные методы обработки, вы можете смоделировать весь интерфейс str
. Вот частичный пример с игрушкой, с которого можно начать:
class MyStr:
def __init__(self, s):
self.s = s
def __add__(self, s):
return MyStr(self.s + str(s))
def __iadd__(self, s):
self.s += str(s)
return self
def __str__(self):
return self.s
def __repr__(self):
return '{}({})'.format(type(self).__name__, self.s)
def lower(self):
return MyStr(self.s.lower())
def ilower(self):
self.s = self.s.lower()
...