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-строки): внутри фигурных скобок можно помещать не только целые переменные, но и отдельные символы с помощью квадратных скобок.
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 importlib
def test(capsys):
expected = "print"
expect_output(capsys, expected)
def expect_output(capsys, expected):
importlib.import_module('solution')
out, _err = capsys.readouterr()
actual = out.strip('\n')
with capsys.disabled():
print('\n')
print(out)
assert actual == expectedРешение учителя откроется через:
20:00
