Изменяемые и неизменяемые объекты в Python
Эта статья объясняет изменяемые и неизменяемые объекты в Python.
YouTube Video
Изменяемые и неизменяемые объекты в Python
«Изменяемый» и «неизменяемый» относятся к изменяемости объекта. Понимание этого поможет избегать неожиданных ошибок и эффективно управлять памятью.
Что такое изменяемый объект?
Изменяемые объекты могут изменять свое внутреннее состояние после создания.
Основные типы данных, являющиеся изменяемыми
list
dict
set
- Пользовательские классы (если их атрибуты могут быть изменены)
Пример: Изменение списка
1numbers = [1, 2, 3]
2numbers[0] = 100
3print(numbers) # [100, 2, 3]
Список — это изменяемый объект, и его элементы можно свободно изменять.
Что такое неизменяемый объект?
Неизменяемые объекты не могут быть изменены после создания. Попытка изменить их приводит к созданию нового объекта.
Основные типы данных, являющиеся неизменяемыми
int
float
str
tuple
bool
frozenset
Пример: Изменение строки
1text = "hello"
2# text[0] = "H" # TypeError: 'str' object does not support item assignment
3
4text = "H" + text[1:] # Creates a new string
5print(text) # "Hello"
Строки являются неизменяемыми, поэтому вы не можете изменить их частично.
Сравнение изменяемых и неизменяемых объектов
1# Mutable example
2a = [1, 2, 3]
3b = a
4b[0] = 100
5print(a) # [100, 2, 3] -> a is also changed
6
7# Immutable example
8x = 10
9y = x
10y = 20
11print(x) # 10 -> x is unchanged
Как показано в примере выше, изменяемые объекты передаются по ссылке, поэтому они могут влиять на другие переменные. С другой стороны, неизменяемые объекты создают новые экземпляры при повторном присвоении, оставляя исходное значение неизменным.
Исследование внутреннего поведения с использованием id()
В Python вы можете использовать функцию id()
для проверки идентификатора объекта. Идентификатор объекта аналогичен адресу в памяти.
1# Immutable int behavior
2a = 10
3print(id(a)) # e.g., 140715920176592
4a += 1
5print(id(a)) # e.g., 140715920176624 -> ID has changed
6
7# Mutable list behavior
8b = [1, 2, 3]
9print(id(b)) # e.g., 2819127951552
10b.append(4)
11print(id(b)) # Same ID -> only the content has changed
Как показано, для неизменяемых типов создается новый объект, тогда как изменяемые типы изменяются на месте.
Функции и осторожность при работе с изменяемыми и неизменяемыми объектами
При передаче изменяемого объекта в функцию, исходные данные могут быть изменены.
Пример: Функция, изменяющая список
1def modify_list(lst):
2 lst.append(100)
3
4my_list = [1, 2, 3]
5modify_list(my_list)
6print(my_list) # [1, 2, 3, 100]
Пример: Функция, изменяющая число
С другой стороны, попытка изменить неизменяемый объект приводит к созданию нового объекта.
1def modify_number(n):
2 n += 10
3
4my_number = 5
5modify_number(my_number)
6print(my_number) # 5 -> unchanged
Практические соображения
Избегайте использования изменяемых объектов в качестве аргументов по умолчанию
1# Bad example
2def add_item(item, container=[]):
3 container.append(item)
4 return container
5
6print(add_item(1)) # [1]
7print(add_item(2)) # [1, 2] -> unintended behavior
8
9# Good example
10def add_item(item, container=None):
11 if container is None:
12 container = []
13 container.append(item)
14 return container
Поскольку аргументы по умолчанию оцениваются только один раз при определении функции, использование изменяемых объектов может привести к непредвиденным последствиям.
Резюме
Для глубокого понимания переменных и типов данных в Python важно понять различия между изменяемыми и неизменяемыми объектами. Понимание этих характеристик помогает избежать непреднамеренного поведения в коде и писать более надежные и читаемые программы.
Вы можете следовать этой статье, используя Visual Studio Code на нашем YouTube-канале. Пожалуйста, также посмотрите наш YouTube-канал.