Python: Неизменяемость примитивных типов
Представим, что у нас есть строка, и мы хотим заменить в ней один символ, например первую букву имени:
first_name = 'Alexander'
first_name[0] = 'B' #Python сразу выдаст ошибку:
TypeError: 'str' object does not support item assignmentЧто это значит? Строки в Python нельзя изменять по частям. После создания они становятся неизменяемыми (или, как говорят программисты, иммутабельными).
Почему строки неизменяемые?
Python устроен так, что примитивные типы (строки, числа, булевы значения) нельзя менять. Это дает важные преимущества:
- Безопасность: значения не изменятся случайно
- Производительность: с неизменяемыми объектами проще работать внутри интерпретатора
- Предсказуемость: меньше неожиданных эффектов при передаче данных в функции
А как тогда изменить строку?
Если нужно "изменить" строку, создается новая строка и сохраняется в ту же переменную:
first_name = 'Alexander'
first_name = 'Blexander'
print(first_name) # => BlexanderПеременная first_name теперь просто указывает на другую строку. Происходит замена значения переменной, а сама строка остается нетронутой.
name = 'Alexander'
name[0] = 'B' → Ошибка! Строки неизменяемы.
name = 'B' + name[1:]
└─────────┬──────────┘
'Blexander' ← создана новая строкаНовая переменная или та же?
Переиспользовать переменную стоит только тогда, когда речь идет об одной и той же сущности. Если пользователь ввел новое имя, это уже другая сущность, и лучше создать отдельную переменную:
# Одна и та же строка, просто обновляем
name = 'Alexander'
name = 'Blexander'
# Разные сущности, лучше разные переменные
first_name = 'Alexander'
corrected_first_name = 'Blexander'Попытка "запихать" все строки в одну переменную запутывает код. Переменная перестает говорить, что в ней хранится.
Вывод
Примитивные типы данных в Python (строки str, целые числа int, вещественные числа float и логические значения bool) являются неизменяемыми (immutable). Это означает, что после создания их внутреннее значение изменить нельзя. Поменять один символ в строке или один разряд в числе невозможно: любые "изменения" происходят путем создания нового значения и переопределения переменной.
Задание
Вам даны три переменные с именами. Составьте и выведите на экран слово из символов в таком порядке:
- Второй символ из первой строки
- Третий символ из третьей строки
- Третий символ из второй строки
- Седьмой символ из второй строки
- Пятый символ из второй строки
Попробуйте использовать интерполяцию (f-строки): внутри фигурных скобок можно помещать не только целые переменные, но и отдельные символы с помощью квадратных скобок.
Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
import runpy
def test(capsys):
expected = "print"
runpy.run_module('solution')
out, _ = capsys.readouterr()
assert out.strip() == expectedРешение учителя откроется через:
20:00
