|
| 1 | +В Python некоторые типы данных называются **неизменяемыми** (или **имутабельными**). Это значит, что после создания их содержимое нельзя изменить. Самые важные примитивные типы, которые являются неизменяемыми: |
1 | 2 |
|
2 | | -Допустим, у нас есть такой вызов: |
| 3 | +- `int` (целые числа), |
| 4 | +- `float` (вещественные числа), |
| 5 | +- `str` (строки), |
| 6 | +- `bool` (булевы значения). |
| 7 | + |
| 8 | +Рассмотрим это на примере строк. |
| 9 | + |
| 10 | +### Методы строк не меняют оригинал |
| 11 | + |
| 12 | +Когда мы вызываем метод у строки, кажется, что мы «меняем» строку, например, переводим в верхний регистр: |
3 | 13 |
|
4 | 14 | ```python |
5 | | -name = 'Tirion' |
6 | | -print(name.upper()) # => TIRION |
7 | | -# Что напечатает на экран этот вызов? |
8 | | -print(name) # => ? |
| 15 | +text = 'hexlet' |
| 16 | +text.upper() |
| 17 | +print(text) # => hexlet |
9 | 18 | ``` |
10 | 19 |
|
11 | | -Вызов метода `.upper()` возвращает новое значение, в котором все буквы преобразованы в верхний регистр, но он не меняет исходную строку. Поэтому внутри переменной окажется старое значение: `'Tirion'`. Эта логика справедлива для методов всех примитивных типов. |
| 20 | +На самом деле метод `upper()` **возвращает новую строку** в верхнем регистре, а оригинальная строка `text` остаётся прежней. Вот так будет правильно: |
| 21 | + |
| 22 | +```python |
| 23 | +text = 'hexlet' |
| 24 | +new_text = text.upper() |
| 25 | +print(new_text) # => HEXLET |
| 26 | +``` |
12 | 27 |
|
13 | | -Вместо того чтобы изменять значения, можно **заменить** значение. Для этого понадобятся переменные: |
| 28 | +Если вы не сохраните результат метода в новую переменную, вы его просто потеряете. |
| 29 | + |
| 30 | +Это касается и других методов: |
14 | 31 |
|
15 | 32 | ```python |
16 | | -name = 'Tirion' |
17 | | -name = name.upper() |
18 | | -print(name) # => TIRION |
| 33 | +text = ' hi ' |
| 34 | +cleaned = text.strip() |
| 35 | +print(cleaned) # => hi |
| 36 | +print(text) # => hi |
19 | 37 | ``` |
| 38 | + |
| 39 | +Метод `strip()` вернул новую строку без пробелов, но сам `text` не изменился. |
| 40 | + |
| 41 | +Методы не изменяют оригинальную строку, потому что строки **не могут быть изменены после создания**. Это решение в языке Python принято специально, и у него есть ряд плюсов: |
| 42 | + |
| 43 | +- Повышенная **надёжность**: никто случайно не изменит значение |
| 44 | +- Упрощение работы в **многопоточном** коде |
| 45 | +- **Оптимизация производительности**: Python может переиспользовать одинаковые строки в памяти, экономя ресурсы |
| 46 | + |
| 47 | +Позже вы увидите, что изменяемость и неизменяемость — важные свойства, особенно при передаче данных в функции и работе с коллекциями. |
0 commit comments