В Python все объекты делятся на два типа: mutable (изменяемые) и immutable (неизменяемые). Это разделение основано на том, может ли объект изменять свое состояние или содержимое после создания. Понимание разницы между этими типами объектов важно для написания корректного и эффективного кода.
Изменяемые объекты — это объекты, состояние которых можно изменить после их создания. Это означает, что вы можете добавлять, удалять или изменять их элементы без создания нового объекта.
Списки (Lists)
Списки являются изменяемыми объектами. Вы можете изменять их содержимое, добавлять или удалять элементы.
my_list = [1, 2, 3]
my_list.append(4) # Добавляем элемент
my_list[0] = 10 # Изменяем элемент
print(my_list) # Вывод: [10, 2, 3, 4]
Словари (Dictionaries)
Словари также являются изменяемыми. Вы можете добавлять, изменять или удалять пары ключ-значение.
my_dict = {'a': 1, 'b': 2}
my_dict['c'] = 3 # Добавляем новую пару ключ-значение
my_dict['a'] = 10 # Изменяем значение по ключу
print(my_dict) # Вывод: {'a': 10, 'b': 2, 'c': 3}
Множества (Sets)
Множества являются изменяемыми объектами. Вы можете добавлять или удалять элементы.
my_set = {1, 2, 3}
my_set.add(4) # Добавляем элемент
my_set.remove(2) # Удаляем элемент
print(my_set) # Вывод: {1, 3, 4}
Неизменяемые объекты — это объекты, состояние которых нельзя изменить после создания. Любая операция, которая якобы изменяет объект, на самом деле создает новый объект.
Числа (Integers, Floats)
Числа являются неизменяемыми объектами. Вы не можете изменить значение числа, но можете создать новое число.
a = 10
b = a # b ссылается на тот же объект, что и a
a = a + 5 # Создается новый объект для a
print(a) # Вывод: 15
print(b) # Вывод: 10
Строки (Strings)
Строки также являются неизменяемыми. Любая операция, которая якобы изменяет строку, на самом деле создает новую строку.
my_string = "hello"
new_string = my_string.upper() # Создается новая строка
print(my_string) # Вывод: hello
print(new_string) # Вывод: HELLO
Кортежи (Tuples)
Кортежи являются неизменяемыми. Вы не можете изменять их содержимое после создания.
my_tuple = (1, 2, 3)
# my_tuple[0] = 10 # Это вызовет ошибку: TypeError
new_tuple = my_tuple + (4,) # Создается новый кортеж
print(my_tuple) # Вывод: (1, 2, 3)
print(new_tuple) # Вывод: (1, 2, 3, 4)
Безопасность данных
Неизменяемые объекты обеспечивают безопасность данных, так как их состояние не может быть изменено после создания. Это особенно полезно при работе с многопоточными приложениями или когда нужно гарантировать, что данные останутся неизменными.
Эффективность памяти
Неизменяемые объекты могут быть кэшированы и повторно использованы, что может привести к экономии памяти. Например, небольшие целые числа и строки в Python кэшируются и повторно используются.
Поведение при передаче в функции
Изменяемые объекты передаются в функции по ссылке, а неизменяемые — по значению. Это означает, что изменения изменяемых объектов внутри функции будут видны снаружи, а изменения неизменяемых объектов — нет.
def modify_list(lst):
lst.append(4)
def modify_string(s):
s = s.upper()
my_list = [1, 2, 3]
modify_list(my_list)
print(my_list) # Вывод: [1, 2, 3, 4]
my_string = "hello"
modify_string(my_string)
print(my_string) # Вывод: hello