все Python 3Строки (str)понятие
Строки в памяти — интернирование, неизменяемость
память
Строки в Python неизменяемы (immutable). Интернирование — кэширование коротких строк-идентификаторов. is проверяет идентичность объектов, == — равенство.
Синтаксис
s[i] = x # TypeError | id(s) | sys.intern(s)
Из неизменяемости следует практическое: upper(), replace(), strip() и срезы ничего не правят на месте, а возвращают новую строку — забыть присвоить результат обратно самая частая ошибка новичка. Сравнивать строки нужно только через ==: is иногда «срабатывает» на литералах благодаря интернированию, но на строке, собранной в рантайме (из ввода или конкатенации), внезапно даёт False; с Python 3.8 сравнение через is с литералом ещё и вызывает SyntaxWarning.
Примеры
s = 'hello'
try:
s[0] = 'H'
except TypeError as e:
print(e)
# → 'str' object does not support item assignment
a = 'hello'
b = 'hello'
print(a == b)
# → True
print(a is b)
# → True (интернирование коротких строк)
import sys
x = sys.intern('some_long_string')
y = sys.intern('some_long_string')
print(x is y)
# → True (принудительное интернирование)
s2 = s.replace('h', 'H')
print(s, s2)
# → hello Hello (оригинал не изменился)
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности